【问题标题】:PHP/GD ImageSaveAlpha and ImageAlphaBlendingPHP/GD ImageSaveAlpha 和 ImageAlphaBlending
【发布时间】:2009-06-22 01:39:21
【问题描述】:

我正在使用 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 格式的 Afaik 图像不能有“透明”背景或 Alpha 通道。
  • 是的,我知道。我只想在 JPEG 输出中将原始 PNG 图像的所有透明区域转换为白色。对不起,如果我解释得不够清楚。

标签: php image png transparency gd


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    希望对您有所帮助。

    【讨论】:

    • 评论图片alphablending($bg, TRUE);行给了我完全相同的结果,但这几乎就是我使用 IMG_COLOR_TRANSPARENT 常量所做的事情。我的主要疑问是同时使用 ImageAlphaBlending 和 ImageSaveAlpha,两者都设置为 true。这是我获得正确结果的唯一方法,但手册说这是错误的,而且两者不能同时为真。
    • 不确定你的代码在做什么,但上面的代码对我有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 2010-11-30
    • 2011-11-16
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多