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

有人可以请教我这个问题吗?

4

2 回答 2

6

这可能取决于您的PNG。PNG 文件可以包含背景颜色,可以在透明度不起作用时使用。您的 PNG 可能有白色背景。当您将 imageaplhablending 设置为 true 时,它​​会从您的 PNG 中获取背景颜色并在编写 JPEG 时使用它。当您将其设置为 false 时,它​​会选择 GD 的默认值,即黑色。

你可以自己试试。创建一个透明的 PNG 并将其保存为橙色或粉红色的背景颜色。您的第二个示例应显示该颜色。

顺便说一句,PNG 背景颜色技巧对于 IE6 图像来说是一个不错的技巧。IE6 不支持透明 PNG,因此它将以您保存它们的任何背景颜色显示它们。保存透明 PNG 时,请使用与您的网站相同的背景颜色保存它们。它看起来比 IE6 中 PNG 图像周围的白框或黑框更好。

于 2009-06-22T07:50:09.103 回答
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;
}

希望有帮助。

于 2009-07-16T01:34:16.363 回答