【问题标题】:Alpha channel failing after Imagick updateImagick 更新后 Alpha 通道失败
【发布时间】:2017-08-25 22:47:54
【问题描述】:

我有一个应用程序经常使用 Imagick 的 PHP 模块来重新着色和合成图像。我最近将服务器的软件从 PHP 5.4 升级到 PHP 7.0,随后也升级了 Imagick。我现在使用模块 3.4.3 运行 ImageMagic 7.0.3。我已经在我的站点的 phpinfo() 和服务器命令 convert -version 中验证了这一点。两者的更新都是在 cPanel 的 WHM 中完成的。

我使用以下函数使用给定的十六进制为图像着色,同时保留它的 alpha 形状,并且在更新之前它工作得很好。

protected function recolor($obj, $hex)
{
    $obj->setImageAlphaChannel(Imagick::ALPHACHANNEL_EXTRACT);
    $obj->setImageBackgroundColor('#' . str_replace('#', '', $hex));
    $obj->setImageAlphaChannel(Imagick::ALPHACHANNEL_SHAPE);
    return $obj;
}

成功重新着色的图像示例(更新前):

具有当前行为的相同输入示例(更新后):

我不确定是什么导致了这种新行为。肯定有颜色被应用,但它没有被应用在提供的图像的形状中。此外,在基础层之后重新着色的所有内容(在此过程中重新着色的第一层)似乎根本没有显示,只有上面显示的层是没有重新着色的层。

编辑:这是重新着色的原始输入图像之一:

https://i.stack.imgur.com/iyaoo.png - 基色

https://i.stack.imgur.com/5W1nr.png - 背景(基础下的合成)

https://i.stack.imgur.com/LUmWd.png - 线稿(基础合成)

下面添加了复合过程。首先,该函数重新着色所有适用的图层对象,然后将它们合成并将它们遮盖到“彩色”图像(上面以狼的形状张贴的“基础”图层)。然后将该图像合成到背景上,并在顶部添加线条和徽标以创建最终图像。

$this->recolor($this->color, $baseHex);
$this->recolor($this->eyes, $eyesHex);
$this->recolor($this->eyebrows, $eyebrowsHex);
$this->recolor($this->pads, $padsHex);
$this->recolor($this->nose, $noseHex);
$this->recolor($this->claws, $clawsHex);
$this->recolor($this->tongue, $tongueHex);

$this->image->newImage(800, 598, new \ImagickPixel('transparent'));
$this->image->compositeImage($this->color, Imagick::COMPOSITE_DEFAULT, 0, 0);
$this->compositeMarkings();
$this->image->compositeImage($this->eyes, Imagick::COMPOSITE_DEFAULT, 0, 0);
$this->image->compositeImage($this->eyebrows, Imagick::COMPOSITE_DEFAULT, 0, 0);
$this->image->compositeImage($this->pads, Imagick::COMPOSITE_DEFAULT, 0, 0);
$this->image->compositeImage($this->nose, Imagick::COMPOSITE_DEFAULT, 0, 0);
$this->image->compositeImage($this->claws, Imagick::COMPOSITE_DEFAULT, 0, 0);
$this->image->compositeImage($this->tongue, Imagick::COMPOSITE_DEFAULT, 0, 0);
$this->mask($this->image, $this->color);
$this->bg->compositeImage($this->image, Imagick::COMPOSITE_DEFAULT, 0, 0);
$this->bg->compositeImage($this->lines, Imagick::COMPOSITE_DEFAULT, 0, 0);
$this->bg->compositeImage($this->logo, Imagick::COMPOSITE_DEFAULT, 0, 0);
$this->bg->setImageColorSpace(Imagick::COLORSPACE_SRGB);`

【问题讨论】:

  • 发布您的输入图像,以便我们对其进行测试。 IM 7.0.3.x 相当旧,可能有错误。您可以升级到当前版本的 IM 7.0.6.9 吗?另外,您的确切次要版本是什么——我的 IM 7.0.3.x 中的 x?
  • @fmw42 感谢您的评论!我已将原始基础图像添加到原始帖子中。我希望这就是你的意思。我的确切版本是ImageMagick 7.0.3-0 Q16 x86_64 2016-09-16
  • 请张贴您的背景图片。如果我了解您正在使用 alpha 通道来制作 -alpha 形状,然后可能会将其合成到一些背景图像上。那是对的吗?如果不是,请从功能上告诉我您在做什么并提供所有输入图像。这样我就可以使用 IM 7.0.3.0 并在命令行中进行测试,并与当前版本的 IM 7.0.6.9 进行比较,以查看它是已修复的错误还是仍然存在的问题。
  • 我提供了合成的背景图像以及合成在基础层上的线稿。此外,我添加了合成图像的代码以更好地说明该过程。非常感谢您到目前为止的帮助。代码通常会分层很多图像,我认为它们都不是测试所必需的,但如果您需要它们,请告诉我。

标签: php imagemagick imagick


【解决方案1】:

Imagemagick 7.0.3.0 有一个错误,我可以在命令行中重现您的问题。

magick 5W1nr.png \( iyaoo.png -alpha extract -background "#988777" -alpha shape \) -compose over -composite LUmWd.png  -compose over -composite result7030.png

但它在命令行中的当前 Imagemagick 7.0.6.9 中运行良好。

magick 5W1nr.png \( iyaoo.png -alpha extract -background "#988777" -alpha shape \) -compose over -composite LUmWd.png  -compose over -composite result7069.png

所以我建议你升级你的 Imagemagick 版本

【讨论】:

    猜你喜欢
    • 2012-01-03
    • 2011-06-18
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    • 2021-11-14
    • 2019-12-23
    • 1970-01-01
    • 2017-12-02
    相关资源
    最近更新 更多