J'ai une application qui utilise fréquemment le module PHP d'Imagick pour recolorer et compiler des images. J'ai récemment mis à niveau le logiciel du serveur de PHP 5.4 vers PHP 7.0 et j'ai ensuite mis à jour Imagick. Je cours maintenant ImageMagic 7.0.3 avec le module 3.4.3. J'ai vérifié ceci dans phpinfo de mon site() et avec la commande de serveur convert -version
. La mise à jour pour les deux a été faite dans WHM de cPanel.Echec du canal alpha après la mise à jour d'Imagick
J'utilise la fonction suivante pour colorer une image en utilisant un hexagone donné tout en préservant sa forme alpha et cela fonctionne très bien jusqu'à la mise à jour.
protected function recolor($obj, $hex)
{
$obj->setImageAlphaChannel(Imagick::ALPHACHANNEL_EXTRACT);
$obj->setImageBackgroundColor('#' . str_replace('#', '', $hex));
$obj->setImageAlphaChannel(Imagick::ALPHACHANNEL_SHAPE);
return $obj;
}
Exemple de l'image avec succès recolored (pré-mise à jour):
Exemple de la même entrée avec le comportement actuel (post-mise à jour):
Je ne suis pas vraiment sûr qu'est-ce qui cause ce nouveau comportement. Il y a certainement de la couleur appliquée, mais elle n'est pas appliquée sous la forme de l'image fournie. De plus, tout ce qui a été recoloré après la couche de base (la première couche recolorée dans ce processus) ne semble pas du tout apparaître, les seules couches montrées ci-dessus étant celles qui ne sont pas recolorées.
Edit: Voici une des images d'entrée d'origine qui obtient Recolored:
https://i.stack.imgur.com/iyaoo.png - Couleur de base
https://i.stack.imgur.com/5W1nr.png - Contexte (Composites sous la base)
https://i.stack.imgur.com/LUmWd.png - Lineart (Composites sur la base)
Le procédé composite a été ajouté ci-dessous. D'abord la fonction recolore tous les objets de calque applicables, puis les compose et les masque à l'image "couleur" (la couche de "base" affichée ci-dessus en forme de loup). Ensuite, cette image est composée sur le fond et les lignes et le logo ajoutés sur le dessus pour créer l'image finale.
$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);`
Déposez votre image d'entrée, afin que nous puissions tester avec elle. IM 7.0.3.x est plutôt vieux et peut avoir des bugs. Pouvez-vous passer à IM 7.0.6.9, la version actuelle? Aussi, quelle est votre version mineure exacte - le x de mon IM 7.0.3.x? – fmw42
@ fmw42 Merci pour votre commentaire! J'ai ajouté l'image de base d'origine à l'article d'origine. J'espère que c'est ce que tu voulais dire. Ma version exacte est 'ImageMagick 7.0.3-0 Q16 x86_64 2016-09-16' –
S'il vous plaît poster votre image de fond. Si je comprends bien, vous utilisez le canal alpha pour faire une forme -alpha et peut-être le compositing sur une image de fond. Est-ce exact?Si non, dites-moi fonctionnellement ce que vous faites et fournissez toutes les images d'entrée. De cette façon, je peux utiliser IM 7.0.3.0 et tester dans la ligne de commande et comparer à IM 7.0.6.9, la version actuelle pour voir si c'était un bug qui a été corrigé ou encore un problème. – fmw42