7 votes

Remplacez une couleur par une autre dans une image avec PHP

Quelqu'un peut-il m'aider avec un simple script pour remplacer une couleur spécifique par une autre couleur dans une image en utilisant PHP? Voici un exemple (la couleur passe du vert au jaune).

avantaprès

21voto

Touki Points 3963

Si vous voulez utiliser la bibliothèque GD en PHP, vous devriez vérifier imagefilter()

Les étapes sont :

  • Commencez avec une image .PNG, utilisez du blanc pour l'intérieur, de l'alpha pour l'extérieur.
  • Utilisez imagefilter($img, IMG_FILTER_COLORIZE, 0, 255, 0)) Où 0,255,0 est votre couleur RGB (vert vif dans cet exemple)
  • Enregistrez l'alpha et affichez le résultat.

Édition, code de travail et clarification.

Je voulais dire, en utilisant alpha pour l'EXTÉRIEUR des lignes noires, et du blanc À L'INTÉRIEUR. Voici l'image d'exemple : WhiteInAlphaOut

Et voici un code de travail pour coloriser les parties blanches :

header('Content-Type: image/png');

/* RGB de votre couleur intérieure */
$rgb = array(0,0,255);
/* Votre fichier */
$file="../test.png";

/* Valeurs négatives, ne pas modifier */
$rgb = array(255-$rgb[0],255-$rgb[1],255-$rgb[2]);

$im = imagecreatefrompng($fichier);

imagefilter($im, IMG_FILTER_NEGATE); 
imagefilter($im, IMG_FILTER_COLORIZE, $rgb[0], $rgb[1], $rgb[2]); 
imagefilter($im, IMG_FILTER_NEGATE); 

imagealphablending( $im, false );
imagesavealpha( $im, true );
imagepng($im);
imagedestroy($im);

Remarque : Nous devons négativer les valeurs puisque la colorisation fonctionne uniquement pour les parties non blanches. Nous pourrions contourner cela en ayant une image avec une bordure blanche et un intérieur noir.

Remarque : Ce code fonctionne uniquement pour les images avec une bordure noire et un intérieur blanc.

4voto

TimSC Points 1196

L'approche lente mais sûre, itérant sur chaque pixel.

fonction ReplaceColour($img, $r1, $g1, $b1, $r2, $g2, $b2)
{
    if(!imageistruecolor($img))
        imagepalettetotruecolor($img);
    $col1 = (($r1 & 0xFF) << 16) + (($g1 & 0xFF) << 8) + ($b1 & 0xFF);
    $col2 = (($r2 & 0xFF) << 16) + (($g2 & 0xFF) << 8) + ($b2 & 0xFF);

    $width = imagesx($img); 
    $height = imagesy($img);
    for($x=0; $x < $width; $x++)
        for($y=0; $y < $height; $y++)
        {
            $colrgb = imagecolorat($img, $x, $y);
            if($col1 !== $colrgb)
                continue; 
            imagesetpixel ($img, $x , $y , $col2);
        }   
}

2voto

David Sigley Points 642

Je suppose que la réponse serait d'avoir plusieurs versions de l'image et puis de charger l'image correcte en fonction de la couleur choisie?

Vous pourriez utiliser une déclaration switch pour charger l'image correcte

//get selected colour
    switch ($colour) {
    case "red":
        echo "

`

J'espère que cela vous aidera.

`

2voto

Florin Frătică Points 130

J'ai essayé ceci:

Et au lieu de remplacer chaque pixel vert j'ai obtenu ceci (la couleur du t-shirt n'a pas changé):

le t-shirt n'a pas été remplacé

1voto

divide by zero Points 848

Ici vous trouvez la couleur la plus proche du bleu et la remplacez par du vert.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X