PHP/GD ImageSaveAlpha 和 ImageAlphaBlending

发布于 2024-07-24 22:42:01 字数 916 浏览 1 评论 0原文

我正在使用 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);

有人可以就这个问题启发我吗?

I'm using GD to resize and convert images, however during my tests I found a weird behavior when converting transparent PNG's to JPEG's. According to the manual ImageAlphaBlending() is on by default but in order to preserve the transparency I must set ImageSaveAlpha() to true (which in turn requires that I set ImageAlphaBlending() to false). So the correct way should be:

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

However if I do it the "correct" way all the transparency area comes up black in the JPEG. This seems to work (JPEG with white background on transparent areas) on my tests:

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

Can someone please enlighten me on this subject?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

抽个烟儿 2024-07-31 22:42:02

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

你可以自己尝试一下。 创建透明 PNG 并使用橙色或粉色背景颜色保存。 你的第二个例子应该显示那种颜色。

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

It probably depends on your PNG. A PNG file can contain a background color, which can be used when transparency doesn't work. Your PNG probably has a white background. When you set imageaplhablending to true it picks up the background color from your PNG and uses that when writing the JPEG. When you set it to false it picks the default for GD which is black.

You can try it for yourself. Create a transparent PNG and save it with an orange or pink background color. Your second example should show that color.

By the way, the PNG background color trick is a nice one for IE6 images. IE6 does not support transparent PNGs so it will display them with whatever background color you saved them with. When saving transparent PNGs, save them with the same background color as your website. It will look better than white or black boxes around your PNG images in IE6.

筱武穆 2024-07-31 22:42:02

如果您要从 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;
}

希望有帮助。

If you are converting from PNG (or GIF) to JPG, you should probably copy the final image to another image that is filled with white, using imagecopy ($image is any image already created with 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;
}

Hope that helps.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文