2017-08-25 70 views
0

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

我使用以下函数使用给定的十六进制对图像进行着色,同时保留它的alpha形状,并且它的工作情况很好,直到更新。图像的

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

例成功地重新着色(更新前): enter image description here

与当前行为(更新后)相同的输入的例子: enter image description here

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

编辑:下面是获取重新着色原始输入图像中的一个:

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);` 
+0

安置自己的输入图像的版本,所以我们可以用它测试。 IM 7.0.3.x比较老,可能会有错误。你能升级到IM 7.0.6.9,目前的版本吗?另外,你的确切次要版本 - 我的IM 7.0.3.x中的x是什么? – fmw42

+0

@ fmw42感谢您的评论!我已将原始基本图像添加到原始帖子。我希望这就是你的意思。我的确切版本是'ImageMagick 7.0.3-0 Q16 x86_64 2016-09-16' –

+0

请发布您的背景图片。如果我明白你正在使用Alpha通道做一个-alpha形状,然后可能合成一些背景图像。那是对的吗?如果不是,请在功能上告诉我你在做什么,并提供所有的输入图像。这样我可以使用IM 7.0.3.0并在命令行中进行测试,并与IM 7.0.6.9(当前版本)进行比较,以查看它是否是一个已修复或仍然存在问题的错误。 – fmw42

回答

2

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 

enter image description here

但它在命令行中工作正常,在当前的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 

enter image description here

所以我建议你升级你的ImageMagick