1
votes

Coloriser PNG en utilisant PHP GD

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: 6Bt.png

Image 2:  6Bd.png

En utilisant mon code, seule l'image 2 fonctionne comme il se doit. 6BC.png

L'image du chien a cependant une sorte de boîte grise, je ne sais pas où diable cela vient de. 6BA.png

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


0 commentaires

3 Réponses :


1
votes

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

Résultat: entrez la description de l'image ici


1 commentaires

Ouais mais maintenant la couleur est fausse. Son à la lumière a déjà essayé cela.



0
votes

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

Résultat:  entrez la description de l'image ici p >


0 commentaires

0
votes

Je l'ai fait fonctionner en utilisant mon code. Tout ce que j'avais à faire est d'ajouter imagepalettetotruecolor($im);


0 commentaires