PHP/GD ImageSaveAlpha 和 ImageAlphaBlending
我正在使用 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这可能取决于你的 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.
如果您要从 PNG(或 GIF)转换为 JPG,您可能应该使用 imagecopy (
$image
是任何已使用 GD 创建的图像):希望有帮助。
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):Hope that helps.