2011-03-11 174 views
1

我有一個PNG,是在透明背景上的一組白色形狀。我正在嘗試改變形狀的顏色,同時保留透明背景。我一直在試驗下面的代碼,它會改變顏色,但會導致黑色背景。我認爲imagetruecolortopalette導致了這個問題,但是如果我刪除那條線,顏色不會改變。任何建議?使用GD來改變透明背景上的一種顏色形狀的顏色,同時保持透明度

<?php 
$imgname = "whiteim.png"; 
$im = imagecreatefrompng ($imgname); 

imagetruecolortopalette($im,false, 255); 

$index = imagecolorclosest ($im, 255,255,255); // get White COlor 
imagecolorset($im,$index,255,0,0); // SET NEW COLOR 

$imgname = "result.png"; 
imagepng($im, $imgname); // save image as png 
imagedestroy($im); 

?> 

回答

0

有一件事是我無法使用imagetruecolortopalette工作。不太清楚你是否可以在你的案例中使用imagefill函數(你需要知道從哪裏開始填充,它有效,如果你有一個區域的白色),但這是我用過的。

另一件事是,你似乎需要在將任何alpha信息保存到png圖像之前調用imagesavealpha,否則它會丟失。很難告訴我爲什麼它不是默認設置。

所有的一切,我的做法是:

$imgname = "whiteim.png";.                                 
$im = imagecreatefrompng ($imgname);                              

imagefill($im, 0,0, imagecolorallocate($im, 255,0,0));                         

$imgname = "result.png";                                 
imagesavealpha($im, True);                                
imagepng($im, $imgname); // save image as png                           
imagedestroy($im); 
+0

這不適合我。也許它與我的形象有關? (附後)。下面的代碼完美工作,但我不明白爲什麼。無論你用什麼替換$ xxxx,它都能正常工作。如果我刪除該行,它不起作用?任何人知道爲什麼? – Kwanzz 2011-03-12 04:21:50

1
@ imagecolortransparent($im, $xxxx); //not sure why this works 

我覺得這個工作,因爲imagecolortransparent使給定的顏色(您放置$ XXXX)透明的,在這種情況下$ XXXX不包含任何值。所以透明是所有不包含顏色值的像素。