PHP/GD图像保存alpha通道和图像alpha混合

4
我正在使用GD来调整大小和转换图像,但是在测试过程中,我发现将透明PNG转换为JPEG时出现了奇怪的行为。根据手册,ImageAlphaBlending()默认为开启状态,但是为了保留透明度,我必须将ImageSaveAlpha()设置为true(这反过来又要求我将ImageAlphaBlending()设置为false)。因此,正确的方法应该是:
$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);

请问有人能为我解释一下这个主题吗?


抱歉!据我所知,JPEG格式的图像不能具有“透明”背景或阿尔法通道。 - merkuro
是的,我知道。我只想让原始PNG图像的所有透明区域在JPEG输出上转换为白色。如果我没有解释清楚,对不起。 - Alix Axel
2个回答

6
这可能取决于你的PNG文件。PNG文件可以包含背景颜色,当透明度无法使用时,可以使用背景颜色。你的PNG可能有白色背景。当你将imageaplhablending设置为true时,它会从你的PNG中提取背景颜色,并在写入JPEG时使用该颜色。当你将其设置为false时,它会选择GD的默认值,即黑色。
你可以自己尝试一下。创建一个透明的PNG并用橙色或粉色背景颜色保存。你的第二个示例应该显示那种颜色。
顺便说一句,PNG背景颜色技巧对于IE6图像非常有用。IE6不支持透明PNG,因此它将以你保存的任何背景颜色显示它们。在保存透明PNG时,请将它们与你网站的相同背景颜色保存。这看起来比在IE6中使用白色或黑色框更好。

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;
}

希望这能帮到您。

注释掉imagealphablending($bg, TRUE);这一行代码可以得到完全相同的结果,尽管这基本上就是我使用IMG_COLOR_TRANSPARENT常量所做的事情。我的主要疑问是ImageAlphaBlending和ImageSaveAlpha的同时使用,两者都设置为true。这是我获得正确结果的唯一方法,但手册说这是错误的,不能同时为true。 - Alix Axel
不确定你的代码在做什么,但是上面的代码对我有效。 - shadowhand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接