2009-07-07 4 views
1

좋아, 나는 몇 달 동안 GD Image로 해킹 해왔고, 내가 수행하고자했던 작업은 기존 이미지를 취하는 스크립트를 만드는 것이었다. 그것의 아래에 반투명하게 사라지는 반사.
은 다음 가이드는 불투명 한 색상으로 작업을 수행하는 방법을 보여줍니다 :PHP GD의 반투명 이미지 리플렉션

// Next we draw a GD line into our gradient_line 
imageline ($gradient_line, 0, 0, $imgName_w, 0, $gdGradientColor); 


$i = 0; 
$transparency = 30; //from 0 - 100 

    while ($i < $gradientHeight) //create line by line changing as we go 
    { 
     imagecopymerge ($background, $gradient_line, 0,$gradient_y_startpoint, 0, 0, $imgName_w, 1, $transparency); 

     ++$i; 
     ++$gradient_y_startpoint; 

       if ($transparency == 100) { 

        $transparency = 100; 

       } 
       else 
       { 
     // this will determing the height of the 
     //reflection. The higher the number, the smaller the reflection. 
     //1 being the lowest(highest reflection) 
        $transparency = $transparency + 1; 

       } 

    } 
: 그 포럼에서 TalkPHP Forums Link

, Rendair는 다음과 같은 PHP 코드와 함께, 색상을 사용하여 동적으로 그려 그라데이션을 오버레이하는 방법을 설명합니다

내가 성취하려고 시도하는 것은 유사하게 알파 피쳐를 사용하여 각 라인을 더 반투명 한 하나의 음영으로 퇴색시키는 효과이지만, 한 번에 한 라인 씩 적용하는 것이 어려워 보인다. 지금까지는 이미지의 작은 부분 (한 줄은 큰 부분) 만 만들어서 반투명 한 부분으로 덮어 씌울 수 있었기 때문에 각 줄을 조금씩 색 바래는 것처럼 보일 수는 없습니다. 그래서 내 의도 된 결과가 초기 이미지가되어야하고, 100 % 알파 투명하게 페이드 된 반영된 사본이되어야하지만, 이것을 달성 할 수는 없습니다.
거기에있는 PHP 사람들은 천재성 아이디어가 있습니까?
업데이트 :이 질문은 저에게 tumbleweed 배지를 받았습니다.

+0

이것은 아주 멋진 생각과 내가 그것에 대한 해결책을 가지고 _think_ ... 몇 가지 코드를 테스트하고 돌아올 것입니다. – shadowhand

+0

아, 물어봐야 겠어 ... 이미지의 높이를 두 배로 늘리시겠습니까 (위의 표준 이미지, 아래 뒤집기 및 뒤집힌 반사)? – shadowhand

+0

둘 중 하나는 괜찮을 것입니다. 아마도 더 쉬운 것은 무엇이든 하프 사이즈로 압축 할 수 있습니다. 마스크를 적용하는 방법을 알아낼 수 없거나 한 번에 한 줄씩 렌더링하고 매번 불투명도를 낮추거나 로그 함수를 사용하여 매끄럽게 또는 다른 방식으로 수행해야하는 경우에는 문제가 될 수 있습니다. 한 줄을 지나서는 안되는 것처럼 보일 수는 있습니다. 한 장만 삽입하는 방식으로 뭔가를 쓰고 있어야합니다. – NateDSaint

답변

1

좋습니다. 강렬했습니다. 긴 이야기를 짧게하기 위해 imagecopymerge은 알파 채널을 제대로 처리하지 못합니다. 대신 각 라인의 불투명도를 낮추려면 imagefilter 필터를 IMG_FILTER_COLORIZE 필터와 함께 사용해야합니다. 이 코드는 이제 Image_GD (BSD 라이센스)의 일부입니다. 가능한 한 명확하게 코드를 작성하려고했지만 질문이 있으면 알려주십시오. Kohana 이미지 라이브러리를 사용하여

사용법은 다음과 같이 작동합니다

// Makes a 20px tall reflection with a starting opacity of 100% 
// and overwrites the original image with the new one 
Image::factory($image_file)->reflection(20, 100)->save(); 

진짜로 중요한 비트는 실제 라인 별 그라데이션 생성을 처리 라인 265-287입니다. $this->width의 모든 인스턴스는 imagesx($image) ($this->height의 경우 imagesy)으로 변환 될 수 있습니다. $this->_image은 기존 이미지에서 생성 된 GD 리소스를 나타냅니다.

아, 그리고 당신은 PNG 또는 제대로 작동하지 않습니다 그라데이션 알파로 이미지를 렌더링해야합니다 ... :)

+0

굉장! 나는 지금 이걸 upvoting하지만 일단 확인하고 그것을 작동 시키면 받아 들일 것입니다. – NateDSaint

+0

사실, 코드 샘플을 가지고 있었습니까? "가능한 한 명확하게 코드를 만들려고했습니다"를 통해이 대답을 보지 못했습니다. – NateDSaint

+0

예제를 사용하여 내 대답을 업데이트 ... 필요한 경우 클래스에서 메서드를 단일 함수로 추출 할 수 있습니다. – shadowhand