【问题标题】:Losing transparency of png with php magickwand and imagemagick when rotation is applied应用旋转时使用 php magickwand 和 imagemagick 丢失 png 的透明度
【发布时间】:2013-04-09 15:49:39
【问题描述】:

您好,我正在从运行 MagickWand 0.1.8 和 ImageMagick 6.2.9 的 Windows 环境中移植一个脚本,其中透明度与 MagickRotateImage 配合得很好。

新环境是运行 MagickWand 1.0.8 和 ImageMagick 6.5.4-7 的 linux,透明度丢失,我的徽标图像一旋转,它就会显示为黑色作为背景。

从我在网上找到的内容来看,PixelSetColor($bg,"none") 似乎不适用于较新的版本,因此是黑色的。最终,我需要知道用什么替换 PixelSetColor($bg,"none") 。我只是没有图像创建的背景,所以在这方面有点挣扎。

首先,我的 php 运行这个函数,它会生成从 url 获取的本地 60x60 版本的 600x600 png 图像。

function makeThumb($fileContents){
    GLOBAL $localImgPath1;
    GLOBAL $localImgPath2;
    $wand = NewMagickWand();
    $lg = MagickReadImageBlob($wand,$fileContents);
    $lg_w = MagickGetImageWidth($wand);
    $lg_h = MagickGetImageHeight($wand);
    $max = max($lg_h,$lg_w);
    $scale_factor = 60/$max;
    MagickResizeImage($wand,$lg_w*$scale_factor,$lg_h*$scale_factor, MW_GaussianFilter, .7);
    MagickWriteImage($wand, $localImgPath1);
    if($localImgPath2!="")
        MagickWriteImage($wand, $localImgPath2);
    $resized_w = MagickGetImageWidth($wand);
    $resized_h = MagickGetImageHeight($wand);
    DestroyMagickWand($wand);
}

然后,我用它来读取本地写入的 png 图像并旋转它:

$logo = NewMagickWand();
$bg = NewPixelWand();
PixelSetColor($bg,"none");
MagickReadImage($logo, $localImgPath1);
MagickRotateImage($logo, $bg, $r);
header('Content-Type: image/PNG');
MagickEchoImageBlob($logo);
DestroyPixelWand($bg);
DestroyMagickWand($logo);

我尝试过添加:

$transparent = NewPixelWand("#FFFFFF");
PixelSetAlpha($transparent, 0);
//and then making the rotate call:
MagickRotateImage($logo, $transparent, $r);

还尝试添加 MagickSetImageAlphaChannel($logo, MW_SetAlphaChannel);在旋转步骤之前。看到一些提到该方法的帖子,但可能这不是使用它的正确方法。不确定。

我在将带有设置字体的文本字符串绘制到图像上的脚本中也遇到了同样的问题。即使在应用旋转之前,黑色也会立即显示在那里,因此希望字体脚本可以使用对徽标脚本的相同修复。

任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: php imagemagick magickwand


    【解决方案1】:

    对于透明背景,您可以选择四个值。依次尝试:

    "none", "transparent", "#00000000", or "rgba(0, 0, 0, 0.0)"
    

    【讨论】:

    • 谢谢。我依次尝试了所有 4 个作为 PixelSetColor 的值(例如:PixelSetColor($bg,"rgba(0, 0, 0, 0.0)"); ),但旋转时仍然显示黑色。
    • 尝试在致电PixelSetColor 后添加对MagickSetBackgroundColor 和/或MagickSetImageBackgroundColor 的呼叫(例如MagickSetImageBackgroundColor($logo, $bg);
    • 感谢您的持续帮助,但到目前为止还不好。分别尝试使用其中的每一个: $logo = NewMagickWand(); $bg = NewPixelWand(); PixelSetColor($bg,"none"); //循环浏览所有 4 个建议值 MagickSetImageBackgroundColor($logo, $bg); MagickReadImage($logo, $localImgPath1); MagickRotateImage($logo, $bg, $r); header('内容类型:图片/PNG'); MagickEchoImageBlob($logo); ...还尝试将它们移动到读取图像之后,甚至在旋转图像之后,但没有好处。这可能是我最初将 png 写入磁盘的其他代码中缺少的步骤吗?
    • 在这一点上,认为它可能只是 ImageMagick 6.5.4-7 的一个错误。发现这篇文章让我得出这个结论:imagemagick.org/discourse-server/viewtopic.php?f=1&t=20312。打算尝试获取更高版本的 IM,看看它是否能解决问题。之后会提供更新。
    【解决方案2】:

    问题出在 ImageMagick 6.5.4-7 上。一定是一个有问题的版本。升级到 6.8.4-10 及以上代码运行良好,PixelSetColor($bg,"none") 适用于透明度。

    【讨论】:

      猜你喜欢
      • 2020-10-22
      • 2016-01-22
      • 2011-05-06
      • 2013-01-19
      • 1970-01-01
      • 1970-01-01
      • 2013-09-13
      • 2019-01-14
      • 2022-01-25
      相关资源
      最近更新 更多