2009-06-22 78 views
3

我使用GD調整大小和轉換圖像,但是在我的測試過程中,當將透明PNG轉換爲JPEG時發現了一個奇怪的行爲。根據手冊ImageAlphaBlending()默認打開,但爲了保持透明度,我必須設置ImageSaveAlpha()爲true(這又要求我將ImageAlphaBlending()設置爲false)。所以,正確的做法應該是:PHP/GD ImageSaveAlpha和ImageAlphaBlending

$result = ImageCreateFromPNG(...); 
ImageAlphaBlending($result, false); 
ImageSaveAlpha($result, true); 
ImageFill($result, 0, 0, IMG_COLOR_TRANSPARENT); 
ImageJPEG($result); 
ImageDestroy($result); 

但是,如果我這樣做「正確」的方式,所有透光面積出現黑在JPEG。這似乎工作(透明區域上的白色背景的JPEG):

$result = ImageCreateFromPNG(...); 
ImageAlphaBlending($result, true); // true by default, but still... 
ImageSaveAlpha($result, true); 
ImageFill($result, 0, 0, IMG_COLOR_TRANSPARENT); 
ImageJPEG($result); 
ImageDestroy($result); 

有人請賜教我關於這個問題?

+0

對不起! JPEG格式的Afaik圖像無法擁有「透明」背景或Alpha通道。 – merkuro 2009-06-22 01:49:04

+0

是的,我知道。我只想將原始PNG圖像的所有透明區域在JPEG輸出上轉換爲白色。對不起,如果我沒有解釋得很好。 – 2009-06-22 02:05:19

回答

6

它可能取決於您的PNG。一個PNG文件可以包含背景色,當透明度不起作用時可以使用該背景色。您的PNG可能具有白色背景。當您將imageaplhablending設置爲true時,它會從您的PNG中獲取背景顏色,並在寫入JPEG時使用它。當你將它設置爲false時,它會選擇GD爲黑色的默認值。

您可以自己嘗試。創建一個透明的PNG並用橙色或粉紅色背景色保存。你的第二個例子應該顯示這種顏色。

順便說一句,PNG背景顏色技巧是一個不錯的IE6圖像。 IE6不支持透明的PNG,所以它會以你保存的背景顏色顯示它們。保存透明PNG時,請使用與網站相同的背景色保存它們。它會比IE6中的PNG圖像周圍的白色或黑色框更好看。

3

如果從PNG(或GIF),以JPG轉換,你應該最終圖像複製到充滿白色另一個圖像,使用imagecopy$image已經與GD創建的任何圖像):

// Create a new background 
$bg = imagecreatetruecolor(imagesx($image), imagesy($image)); 

// Allocate the color 
$color = imagecolorallocate($bg, 255, 255, 255); 

// Fill the background with white 
imagefill($bg, 0, 0, $color); 

// Alpha blending must be enabled on the background! 
imagealphablending($bg, TRUE); 

// Copy the current image onto the opaque background 
if (imagecopy($bg, $image, 0, 0, 0, 0, imagesx($image), imagesy($image))) 
{ 
    // Replace the image with the background copy 
    imagedestroy($image); 
    $image = $bg; 
} 

希望有幫助。