Imagick 更新后 Alpha 通道失败

Alpha channel failing after Imagick update

我有一个应用程序经常使用 Imagick 的 PHP 模块来重新着色和合成图像。我最近将服务器的软件从 PHP 5.4 升级到 PHP 7.0,随后也升级了 Imagick。我现在是 运行 ImageMagic 7.0.3,模块是 3.4.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;
}

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

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

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

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

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

https://i.stack.imgur.com/5W1nr.png - 背景(基础复合材料)

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

下面添加了复合过程。首先,该函数重新着色所有适用的图层对象,然后将它们合成并将它们蒙版到 "color" 图像(上面的 "base" 图层 post 以狼的形状编辑)。然后将该图像合成到背景上,并在顶部添加线条和徽标以创建最终图像。

$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);`

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版本