2017-08-25 109 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