2009-07-07 60 views
1

好的,我一直在用GD Image進行幾個月的黑客攻擊,我想完成的一項任務是創建一個腳本,它接收現有圖像,然後創建一種反射在它下面變得透亮。
以下指南顯示瞭如何用不透明的顏色做:TalkPHP Forums Link

在該論壇上,Rendair描述了一種使用顏色,用下面的PHP代碼,以覆蓋一個動態繪製漸變: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; 

       } 

    } 

我試圖完成的效果是,我們使用alpha特徵將每條線逐漸淡入一個更透明的線條,但似乎我很難一次將其應用於一條線。到目前爲止,我只能對圖像進行一小部分(一行很大),然後用半透明的圖像進行覆蓋,但我似乎無法將每行更多地淡化。所以我的預期結果應該是最初的圖像,然後是一個反射的副本,可以淡化到100%alpha透明,但我似乎無法完成此任務。
任何PHP的人誰有任何天才的想法?
更新:這個問題爲我贏得了風滾草徽章。

+0

這是一個非常酷的想法,我_think_我有這方面的解決方案...我會測試一些代碼並回來。 – shadowhand 2009-07-15 16:15:12

+0

哦,我應該問過...你想把圖像的高度加倍(上面的標準圖像,下面翻轉和褪色的反射)? – shadowhand 2009-07-15 16:17:51

回答

1

好的,那是激烈的。長話短說,imagecopymerge沒有正確處理alpha通道。相反,您需要使用imagefilterIMG_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)(並且爲imagesy)。 $this->_image是指從現有圖像創建的GD資源。

哦,並確保您呈現圖像爲PNG或漸變阿爾法將無法正常工作... :)