7
votes

Remplacer une couleur avec une autre dans une image avec PHP

Quelqu'un peut-il m'aider avec un script simple pour remplacer une couleur spécifique avec une autre couleur dans une image à l'aide de PHP? Voici un exemple (la couleur changée du vert au jaune).

avant après


5 Réponses :


1
votes

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

Vous pouvez utiliser une instruction de commutation pour charger l'image correcte P>

//get selected colour
    switch ($colour) {
    case "red":
        echo "<img src='RED IMAGE' ";
        break;
    case "blue":
        echo "<img src='blue IMAGE' ";
        break;
    case "green":
        echo "<img src='green IMAGE' ";
        break;
}


3 commentaires

Que se passe-t-il si l'utilisateur veut choisir un rouge plus foncé / plus sombre? Je ne peux pas faire 1 million d'images. C'est pourquoi je voulais une autre solution (en utilisant la bibliothèque GD, je pense).


Pourquoi cela vient-il de voter? Je reçois que ce ne soit pas la bonne solution, mais la question ne précise pas qu'ils veulent une combinaison de couleurs possible.


DOWN voté peut-être, ce n'est pas une façon de développer de penser :-)



22
votes

Si vous vouliez utiliser la bibliothèque GD en PHP, vous devez vérifier sur imageFilter ()

Étapes sont: p>

  • Commencez par une image .png, utilisez blanc pour intérieur, alpha pour extérieur. li>
  • Utilisez imagefilter ($ img, img_filter_coloriser, 0, 255, 0)) code> où 0,255,0 est votre couleur RVB (vert clair dans cet exemple) li>
  • Enregistrez le résultat alpha et d'impression. LI> ul>

    Modifier, code de travail et clarification. P>

    Je voulais dire, en utilisant alpha pour externe des lignes noires et blanche à l'intérieur. Voici l'exemple d'image: whiteinalphaout p>

    et voici un code de travail pour coloriser les parties blanches: p>

    header('Content-Type: image/png');
    
    /* RGB of your inside color */
    $rgb = array(0,0,255);
    /* Your file */
    $file="../test.png";
    
    /* Negative values, don't edit */
    $rgb = array(255-$rgb[0],255-$rgb[1],255-$rgb[2]);
    
    $im = imagecreatefrompng($file);
    
    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);
    


4 commentaires

J'ai essayé ceci mais cela a également changé le fond (qui était transparent) à un verdâtre. Devrais-je faire le fond blanc?


Il est également bon de faire une étape de filtrage de plus avant celles mentionnées à l'aide de la luminosité et de la valeur négative élevée pour vous assurer que l'image contient des couleurs pure noir (# 000) et pure blanche (#FFF) uniquement. Quelle que soit la documentation, utilisez -10000 Valeur avec ce filtre pour éviter les pixels à moitié gris. Que Colorize a le sens et la couleur que vous avez définie colorisera la zone noire correctement. Cette procédure est utilisée par certaines bibliothèques PHP pour appliquer des bitmasks B / W pour rendre les régions personnalisées de l'image transparente.


N'est-ce pas seulement pour échanger une couleur polaire opposée? Et si c'est vert au bleu au lieu de vert au contraire du vert? Ou suis-je comprendre ce code de manière incorrecte?


Ce truc de nier est génial, merci alors que j'essayais de teinter de coloriser, mais que je n'affecte pas le blanc!



1
votes
<?php
header("Content-type: image/png");
$im = imagecreate(200, 200)
imagefill($im, 0, 0, $red);

// above could come from an uploaded image
// find a blue in the image
$newblue = imagecolorclosest($im, 0, 0, 255);
// change it to green
imagecolorset($im, $newblue, 0, 255, 0);
imagepng($im);
imagedestroy($im);
?php>
Here you find closest color to the blue and replace with green.

0 commentaires

1
votes

J'ai essayé ceci:

<?php
$imgname = "1.gif";
$im = imagecreatefromgif ($imgname);
$index = imagecolorexact ($im,0,128,0);
imagecolorset($im,$index,240,255,0);
$imgname = "result.gif";
imagegif($im,$imgname);
?>
<img src="result.gif">


1 commentaires

C'est drôle ha ha



1
votes

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

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


0 commentaires