Je veux coloriser certains PNG en utilisant PHP GD. À des fins de test, j'ai codé en dur la couleur rouge (255,0,0) qui plus tard sera remplacée par une variable dynamique.
Par exemple, j'ai ces deux images:
Image 1:
Image 2:
En utilisant mon code, seule l'image 2 fonctionne comme il se doit.
L'image du chien a cependant une sorte de boîte grise, je ne sais pas où diable cela vient de.
Voici le code que j'utilise:
<?php $im = imagecreatefrompng('dog.png'); imagealphablending($im, false); imagesavealpha($im, true); $w = imagesx($im); $h = imagesy($im); for ($x = 0; $x < $w; $x++) { for ($y = 0; $y < $h; $y++) { $color = imagecolorsforindex($im, imagecolorat($im, $x, $y)); $r = ($color['red'] * 255) / 255; $g = ($color['green'] * 0) / 255; $b = ($color['blue'] * 0) / 255; imagesetpixel($im, $x, $y, imagecolorallocatealpha($im, $r, $g, $b, $color['alpha'])); } } imagepng($im, 'result.png'); imagedestroy($im);
Pourquoi fonctionne-t-il avec l'image 2 mais pas avec l'image 1? Je ne peux penser qu'à une sorte de masque alpha avec l'image 1.
J'espère que quelqu'un pourra m'aider
3 Réponses :
Cela pourrait être fait plus facilement en utilisant imagefilter()
:
<?php $im = imagecreatefrompng('dog.png'); imagefilter($im, IMG_FILTER_COLORIZE, 255, 0, 0); imagepng($im, 'result.png'); imagedestroy($im);
Ouais mais maintenant la couleur est fausse. Son à la lumière a déjà essayé cela.
Ce n'est pas mentionné dans la documentation de imagecolorallocate ()
ou de son équivalent alpha, mais quelqu'un a signalé dans les commentaires que vous ne pouvez allouer que 255 couleurs dans l'image avant de manquer. Vérifiez que l'allocation n'a pas échoué avant d'utiliser la nouvelle couleur. Si tel est le cas, utilisez imagecolorclosestalpha ()
pour obtenir la meilleure chose suivante.
<?php $replace = [255, 0, 0]; array_walk($replace, function(&$v, $k) {$v /= 255;}); $im = imagecreatefrompng('dog.png'); for ($x = 0; $x < imagesx($im); $x++) { for ($y = 0; $y < imagesy($im); $y++) { $color = imagecolorsforindex($im, imagecolorat($im, $x, $y)); $r = $color["red"] * $replace[0]; $g = $color["green"] * $replace[1]; $b = $color["blue"] * $replace[2]; $a = $color["alpha"]; $newcolour = imagecolorallocatealpha($im, $r, $g, $b, $a); if ($newcolour === false) { $newcolour = imagecolorclosestalpha($im, $r, $g, $b, $a); } imagesetpixel($im, $x, $y, $newcolour); } } imagepng($im, 'result.png'); imagedestroy($im);
Je l'ai fait fonctionner en utilisant mon code. Tout ce que j'avais à faire est d'ajouter imagepalettetotruecolor($im);