Aller au contenu

Changement couleur (gd)


Sujets conseillés

Posté

Bonjour,

Je recherche actuellement le moyen avec gd pour pouvoir changer une couleur sur l'image X par une autre couleur ou soit supprimer cette couleur de l'image

Je pense et j'espère qu'en GD on devrait pouvoir,mais je n'ai pas trouvé dans doc de php,j'espère que vous pourrez m'aider.

Merci d'avance.

A bientôt.

Posté

Salut,

Tu peux relever la couleur d'un point dans une image (à condition bien sûr qu'elle soit en couleurs indexées). Donc ton truc est faisable (en scannant tous les points de l'image, certes, mais faisable).

Fonction imagecolorat

Sinon, qu'entends-tu par "supprimer une couleur" ?

Posté (modifié)

Si tu veux imagine que j'ai des points bleu sur l'image,je souhaite remplacer tous les pixels ou il y a de la couleur bleu par de la couleur rouge par exemple.

Modifié par snwoman49
Posté

Voilà ce que j'ai tenté de faire mais qui ne marche pas.

$i = 0;
$x = 1000;
$yii = 1;
$y = 1000;

while($i != $x)
   {
if($i == '1000')
{
$yii += 1;
$color = imagecolorat($im, $i, $yii);
//ici j'ai des if et elseif pour analyser la ou les couleur
}
   $i++;
}

En fet ce que je voudrais faire c'est par exemple analyse tout d'abord quand Y = 0 et faire varier x de 0 à 200,quand x = 1000 on rajoute 1 à Y jusqu'a que Y = 1000 et là on arrête.

Merci pour votre aide,à bientôt.

Posté (modifié)

bonjour,

je vai te donner une piste sure:

je pars d'une image $img

// si c'est une true color, convertir en image à palette 256 avec tramage
imagetruecolortopalette($img, true, 256);

// boucle pour lister les 256 couleurs
 for( $i=0; $i<imagecolorstotal( $img ); $i++ ) {

// récupération des valeurs RVB de la nuance $i
   $c = ImageColorsForIndex( $img, $i );

// recherche des points blesu et transformation en équivalent rouge
if ($c["red"]<30 &&  $c["green"]<30 && $c["blue"]>230) {
$c["red"]=$c["blue"];
$c["blue"]=1;
}

 // réatribution des nouvelles valeurs RVB au même index de la palette
   imagecolorset( $img, $i, $c["red"], $c["green"], $c["blue"] );

 }

Voilà, en fait c'est pas si compliqué que celà n'y parait :)

Modifié par Duxmachine
Posté

Merci duxmachine mais en fet j'ai trouvé la solution pour ce que je veux faire,j'ai juste un problème avec la boucle, comme expliqué plus haut.

Je voudrais tout d'abord qu'on parte de y = 1 on faits 400x par exemple,quand on arrive à 400x on rajoute +1 à y et on recommence ainsi de suite jusqu'a que y = 400 par exemple.Vous voyez ce que je veux dire :)

Posté

pour une boucle dans le sens de lecture naturel:

for (y=0; y<400; y++) {

for (x=0; x<400; x++) {

$couleur=imagecolorat($img, $x, $y);

}

}

Et pour une lecture en sens vertical puis horizontal, inverser les 2 for()

Posté

Super merci Duxmachine ca marche impec !.

Maintenant j'ai un autre petit problème je voudrais rendre mon image 1 transparent pour ensuite la copié sur l'image 2.

$im = imagecreatefrompng('monurl.png');

/////////////////////////////////////////////////////////////////////////////
$blanc = imagecolorallocate($im, 255, 255, 255);

imagecolortransparent($im,$blanc);

Mais ca ne marche pas,l'image n'est pas transparente.

Posté

tu peux rendre mettre une couleur transparente à la place du blanc que je t'ai donné:

imagecolorallocatealpha($im, 255, 255, 255, 127);

127 = transparence maxi.

Posté

Voilà ca ca marche impec encore merci!

Maintenant j'ai un problème avec une autre carte que j'essaie de faire générer.

<?php
   header ("Content-type: image/Png");
   $im = imagecreatefromgif('url.gif');
   $img = imagecreatefromgif('url.gif');
//On définit les couleurs
$audessusvingtsix = imagecolorallocate($im, 254, 0, 225);
$audessusvingt = imagecolorallocate($im, 180, 0, 50);
$audessusquatorze = imagecolorallocate($im, 220, 75,30);
$audessushuight = imagecolorallocate($im, 254, 150, 0);
$audessusdeux = imagecolorallocate($im, 254, 225, 0);
$audessusmoinsquatre = imagecolorallocate($im, 0, 240, 40);
$audessusmoinsdix = imagecolorallocate($im, 0, 230, 160);
$audessusmoinsseize = imagecolorallocate($im, 0, 150, 254);
$audessusmoinsvinght = imagecolorallocate($im, 0, 50, 254);
$audessusmoinstrente = imagecolorallocate($im, 200, 0, 254);
$audessusmoinstrentesix = imagecolorallocate($im,50, 0, 50);






///boucle

for ($y=0; $y<650; $y+10) {

for ($x=0; $x<800; $x+10) {

$color = imagecolorat($img, $x, $y);

if($color == '32')
{
$x /= 1.037;
$y /= 1.4;
$x = round($x,0);
$y = round($y,0);
imagestring($im, 2, $x, $y, "> 32", $audessusvingtsix);
}
elseif($color == '30')
{
$x /= 1.037;
$y /= 1.4;
$x = round($x,0);
$y = round($y,0);
imagestring($im, 2, $x, $y, "30", $audessusvingtsix);
}
elseif($color == '29')
{
$x /= 1.037;
$y /= 1.4;
$x = round($x,0);
$y = round($y,0);
imagestring($im, 2, $x, $y, "28", $audessusvingtsix);
}
elseif($color == '26')
{
$x /= 1.037;
$y /= 1.4;
$x = round($x,0);
$y = round($y,0);
imagestring($im, 2, $x, $y, "26", $audessusvingtsix);
}
elseif($color == '24')
{
$x /= 1.037;
$y /= 1.4;
$x = round($x,0);
$y = round($y,0);
imagestring($im, 2, $x, $y, "24", $audessusvingt);
}
elseif($color == '18')
{
$x /= 1.037;
$y /= 1.4;
$x = round($x,0);
$y = round($y,0);
imagestring($im, 2, $x, $y, "22", $audessusvingt);
}
elseif($color == '16')
{
$x /= 1.037;
$y /= 1.4;
imagestring($im, 2, $x, $y, "20", $audessusvingt);
}
elseif($color == '17')
{
$x /= 1.037;
$y /= 1.4;
$x = round($x,0);
$y = round($y,0);
imagestring($im, 2, $x, $y, "18", $audessusquatorze);
}
elseif($color == '19')
{
$x /= 1.037;
$y /= 1.4;
imagestring($im, 2, $x, $y, "16", $audessusquatorze);
}
elseif($color == '21')
{
$x /= 1.037;
$y /= 1.4;
$x = round($x,0);
$y = round($y,0);
imagestring($im, 2, $x, $y, "14", $audessusquatorze);
}
elseif($color == '22')
{
$x /= 1.037;
$y /= 1.4;
$x = round($x,0);
$y = round($y,0);
imagestring($im, 2, $x, $y, "12", $audessushuight);
}
elseif($color == '23')
{
$x /= 1.037;
$y /= 1.4;
$x = round($x,0);
$y = round($y,0);
imagestring($im, 2, $x, $y, "10", $audessushuight);
}
elseif($color == '33')
{
$x /= 1.037;
$y /= 1.4;
$x = round($x,0);
$y = round($y,0);
imagestring($im, 2, $x, $y, "8", $audessushuight);
}
elseif($color == '34')
{
$x /= 1.037;
$y /= 1.4;
$x = round($x,0);
$y = round($y,0);
imagestring($im, 2, $x, $y, "6", $audessusdeux);
}
elseif($color == '35')
{
$x /= 1.037;
$y /= 1.4;
$x = round($x,0);
$y = round($y,0);

imagestring($im, 2, $x, $y, "4", $audessusdeux);
}
elseif($color == '36')
{
$x /= 1.037;
$y /= 1.4;
$x = round($x,0);
$y = round($y,0);
imagestring($im, 2, $x, $y, "2", $audessusdeux);
}
elseif($color == '37')
{
$x /= 1.037;
$y /= 1.4;
$x = round($x,0);
$y = round($y,0);
imagestring($im, 2, $x, $y, "0", $audessusmoinsquatre);
}
elseif($color == '8')
{
$x /= 1.037;
$y /= 1.4;
$x = round($x,0);
$y = round($y,0);
imagestring($im, 2, $x, $y, "-2", $audessusmoinsquatre);
}
elseif($color == '9')
{
$x /= 1.037;
$y /= 1.4;
$x = round($x,0);
$y = round($y,0);
imagestring($im, 2, $x, $y, "-4", $audessusmoinsquatre);
}
elseif($color == '10')
{
$x /= 1.037;
$y /= 1.4;
$x = round($x,0);
$y = round($y,0);
imagestring($im, 2, $x, $y, "-6", $audessusmoinsdix);
}
elseif($color == '11')
{
$x /= 1.037;
$y /= 1.4;
$x = round($x,0);
$y = round($y,0);
imagestring($im, 2, $x, $y, "-8", $audessusmoinsdix);
}
elseif($color == '13')
{
$x /= 1.037;
$y /= 1.4;
$x = round($x,0);
$y = round($y,0);
imagestring($im, 2, $x, $y, "-10", $audessusmoinsdix);
}
elseif($color == '15')
{
$x /= 1.037;
$y /= 1.4;
$x = round($x,0);
$y = round($y,0);
imagestring($im, 2, $x, $y, "-12", $audessusmoinsseize);
}
elseif($color == '14')
{
$x /= 1.037;
$y /= 1.4;
$x = round($x,0);
$y = round($y,0);
imagestring($im, 2, $x, $y, "-14", $audessusmoinsseize);
}
elseif($color == '12')
{
$x /= 1.037;
$y /= 1.4;
$x = round($x,0);
$y = round($y,0);
imagestring($im, 2, $x, $y, "-16", $audessusmoinsseize);
}
elseif($color == '6')
{
$x /= 1.037;
$y /= 1.4;
$x = round($x,0);
$y = round($y,0);
imagestring($im, 2, $x, $y, "-18", $audessusmoinsvinght);
}
elseif($color == '4')
{
$x /= 1.037;
$y /= 1.4;
$x = round($x,0);
$y = round($y,0);
imagestring($im, 2, $x, $y, "-20", $audessusmoinsvinght);
}
elseif($color == '5')
{
$x /= 1.037;
$y /= 1.4;
$x = round($x,0);
$y = round($y,0);
imagestring($im, 2, $x, $y, "-22", $audessusmoinsvinght);
}
elseif($color == '7')
{
$x /= 1.037;
$y /= 1.4;
$x = round($x,0);
$y = round($y,0);
imagestring($im, 2, $x, $y, "-24",$audessusmoinstrente);
}
elseif($color == '25')
{
$x /= 1.037;
$y /= 1.4;
$x = round($x,0);
$y = round($y,0);
imagestring($im, 2, $x, $y, "-26",$audessusmoinstrente);
}
elseif($color == '28')
{
$x /= 1.037;
$y /= 1.4;
$x = round($x,0);
$y = round($y,0);
imagestring($im, 2, $x, $y, "-28",$audessusmoinstrente);
}
elseif($color == '31')
{
$x /= 1.037;
$y /= 1.4;
$x = round($x,0);
$y = round($y,0);
imagestring($im, 2, $x, $y, "-30",$audessusmoinstrente);
}
elseif($color == '27')
{
$x /= 1.037;
$y /= 1.4;
$x = round($x,0);
$y = round($y,0);
imagestring($im, 2, $x, $y, "-32",$audessusmoinstrente);
}
elseif($color == '34')
{
$x /= 1.037;
$y /= 1.4;
$x = round($x,0);
$y = round($y,0);
imagestring($im, 2, $x, $y, "-34",$audessusmoinstrente);
}
elseif($color == '2')
{
$x /= 1.037;
$y /= 1.4;
$x = round($x,0);
$y = round($y,0);
imagestring($im, 2, $x, $y, "-36",$audessusmoinstrente);
}
elseif($color == '1')
{
$x /= 1.037;
$y /= 1.4;
$x = round($x,0);
$y = round($y,0);
imagestring($im, 2, $x, $y, "<-36",$audessusmoinstrentesix);
}
else
{
}

}

}
 imagepng($im);
imagedestroy($im);
?>

Et voilà le message d'erreur afficher à l'écran

L'image «url.php » ne peut être affichée, car elle contient des erreurs.

J'ai fait clic droit pour voir les erreurs mais ca ne m'affiche rien !

Pourtant tout mon code ) l'air bon !

J'espère que vous pourrez m'aider à bientôt.

Posté

2 possibilités:

-soit tu as quelque chose avant le header()

Si oui, retire ce qu'il y a avant

-soit tu as une erreur dans le script qui retourne une message d'erreur ecrit. Dans ce cas fait un essai sans le header() pour voir ce message d'erreur

Posté

Voici l'erreur que ca me renvoie !

Fatal error: Maximum execution time of 10 seconds exceeded in monfichier.php on line 70

Comment faire pour executer moins de requêtes !

Posté (modifié)

Ton erreur n'est pas le nombre de calcul mais le formatage des boucles:

à la place de for ($y=0; $y<650; $y+10)

écrit for ($y=0; $y<650; $y=$y+10)

pareil pour les X

Tu peux alléger ton code

$x=round($x/1.037);
$y=round($y/1.4);

Tu peux aussi te créer une petite fonction utilisateur pour éviter de tout répéter

Ou utiliser switch case break

switch ($color) {
case 32: $x=round($x/1.037); $y=round($y/1.4); imagestring($im, 2, $x, $y, "> 32", $audessusvingtsix); break;
case 30: $x=round($x/1.037); $y=round($y/1.4); imagestring($im, 2, $x, $y, "> 30", $audessusvingtsix); break;

etc...


}

Modifié par Duxmachine
Posté

Toujours ce même message d'erreur .

Voici le code comme tu me l'as conseiller duxmachine

<?php
   $im = imagecreatefromgif(''url.gif');
   $img = imagecreatefromgif('url.gif');
//On définit les couleurs
$audessusvingtsix = imagecolorallocate($im, 254, 0, 225);
$audessusvingt = imagecolorallocate($im, 180, 0, 50);
$audessusquatorze = imagecolorallocate($im, 220, 75,30);
$audessushuight = imagecolorallocate($im, 254, 150, 0);
$audessusdeux = imagecolorallocate($im, 254, 225, 0);
$audessusmoinsquatre = imagecolorallocate($im, 0, 240, 40);
$audessusmoinsdix = imagecolorallocate($im, 0, 230, 160);
$audessusmoinsseize = imagecolorallocate($im, 0, 150, 254);
$audessusmoinsvinght = imagecolorallocate($im, 0, 50, 254);
$audessusmoinstrente = imagecolorallocate($im, 200, 0, 254);
$audessusmoinstrentesix = imagecolorallocate($im,50, 0, 50);






///boucle

for($y=0; $y<650; $y=$y+10) {

for ($x=0; $x<800; $x=$x +10) {

$color = imagecolorat($img, $x, $y);

switch ($color) {
case 32: $x=round($x/1.037); $y=round($y/1.4); imagestring($im, 2, $x, $y, "> 32", $audessusvingtsix); break;
case 30: $x=round($x/1.037); $y=round($y/1.4); imagestring($im, 2, $x, $y, "> 30", $audessusvingtsix); break;
case 23: $x=round($x/1.037); $y=round($y/1.4); imagestring($im, 2, $x, $y, "28", $audessusvingtsix); break;
case 26: $x=round($x/1.037); $y=round($y/1.4); imagestring($im, 2, $x, $y, "26", $audessusvingtsix); break;
case 24: $x=round($x/1.037); $y=round($y/1.4); imagestring($im, 2, $x, $y, "24", $audessusvingt); break;
case 18: $x=round($x/1.037); $y=round($y/1.4); imagestring($im, 2, $x, $y, "22", $audessusvingt); break;
case 16: $x=round($x/1.037); $y=round($y/1.4); imagestring($im, 2, $x, $y, "20", $audessusvingt); break;
case 17: $x=round($x/1.037); $y=round($y/1.4); imagestring($im, 2, $x, $y,"18", $audessusquatorze); break;
case 19: $x=round($x/1.037); $y=round($y/1.4); imagestring($im, 2, $x, $y,"16", $audessusquatorze); break;
case 21: $x=round($x/1.037); $y=round($y/1.4); imagestring($im, 2, $x, $y,"14", $audessusquatorze); break;
case 22: $x=round($x/1.037); $y=round($y/1.4); imagestring($im, 2, $x, $y,"12", $audessushuight); break;
case 23: $x=round($x/1.037); $y=round($y/1.4); imagestring($im, 2, $x, $y,"10", $audessushuight); break;
case 33: $x=round($x/1.037); $y=round($y/1.4); imagestring($im, 2, $x, $y,"8", $audessushuight); break;
case 34: $x=round($x/1.037); $y=round($y/1.4); imagestring($im, 2, $x, $y,"6", $audessusdeux); break;
case 35: $x=round($x/1.037); $y=round($y/1.4); imagestring($im, 2, $x, $y, "4", $audessusdeux); break;
case 36: $x=round($x/1.037); $y=round($y/1.4); imagestring($im, 2, $x, $y, "2", $audessusdeux); break;
case 37: $x=round($x/1.037); $y=round($y/1.4); imagestring($im, 2, $x, $y, "0",  $audessusmoinsquatre); break;
case 8: $x=round($x/1.037); $y=round($y/1.4); imagestring($im, 2, $x, $y, "-2",  $audessusmoinsquatre); break;
case 9: $x=round($x/1.037); $y=round($y/1.4); imagestring($im, 2, $x, $y, "-4",  $audessusmoinsquatre); break;
case 10: $x=round($x/1.037); $y=round($y/1.4); imagestring($im, 2, $x, $y, "-6", $audessusmoinsdix); break;
case 11: $x=round($x/1.037); $y=round($y/1.4); imagestring($im, 2, $x, $y, "-8", $audessusmoinsdix); break;
case 13: $x=round($x/1.037); $y=round($y/1.4); imagestring($im, 2, $x, $y, "-10", $audessusmoinsdix); break;
case 15: $x=round($x/1.037); $y=round($y/1.4); imagestring($im, 2, $x, $y, "-12", $audessusmoinsseize); break;
case 14: $x=round($x/1.037); $y=round($y/1.4); imagestring($im, 2, $x, $y, "-14", $audessusmoinsseize); break;
case 12: $x=round($x/1.037); $y=round($y/1.4); imagestring($im, 2, $x, $y, "-16", $audessusmoinsseize); break;
case 6: $x=round($x/1.037); $y=round($y/1.4); imagestring($im, 2, $x, $y, "-18", $audessusmoinsvinght); break;
case 4: $x=round($x/1.037); $y=round($y/1.4); imagestring($im, 2, $x, $y, "-20", $audessusmoinsvinght); break;
case 5: $x=round($x/1.037); $y=round($y/1.4); imagestring($im, 2, $x, $y, "-22", $audessusmoinsvinght); break;
case 7: $x=round($x/1.037); $y=round($y/1.4); imagestring($im, 2, $x, $y, "-24",$audessusmoinstrente); break;
case 25: $x=round($x/1.037); $y=round($y/1.4); imagestring($im, 2, $x, $y, "-26",$audessusmoinstrente); break;
case 28: $x=round($x/1.037); $y=round($y/1.4); imagestring($im, 2, $x, $y, "-28",$audessusmoinstrente); break;
case 31: $x=round($x/1.037); $y=round($y/1.4); imagestring($im, 2, $x, $y, "-30",$audessusmoinstrente); break;
case 27: $x=round($x/1.037); $y=round($y/1.4); imagestring($im, 2, $x, $y, "-32",$audessusmoinstrente); break;
case 34: $x=round($x/1.037); $y=round($y/1.4); imagestring($im, 2, $x, $y, "-34",$audessusmoinstrente); break;
case 2: $x=round($x/1.037); $y=round($y/1.4); imagestring($im, 2, $x, $y, "-36",$audessusmoinstrente); break;
case 1: $x=round($x/1.037); $y=round($y/1.4); imagestring($im, 2, $x, $y, "<-36",$audessusmoinstrentesix); break;


}

 }

}
 imagepng($im);
imagedestroy($im);
?>

Posté

lol, je viens de voir l'erreur récurente:

il faut choisir un autre nom de variable dans les switch car $x et $y sont déjà utilisés par les boucles.

je les remplace par $x2 et $y2

case 32: $x2=round($x/1.037); $y2=round($y/1.4); imagestring($im, 2, $x2, $y2, "> 32", $audessusvingtsix); break;

C'est tout bête mais c'est une erreur d'inattention qui arrive souvent :)

Posté (modifié)

yes merci ca marche impec.

Super Duxmachine :)

Un autre truc que j'aimerais savoir s'il est possible de faire est de partir des bords de l'image donc de 0 et après fait le +10 par exemple :)

Modifié par snwoman49
Posté (modifié)

J'ai un problème avec Gd est les imagecolorat qui me servent à récupèrer l'index de la couleur et d'ensuite utiliser cette couleur pour mettre sur mon image,cet index est récupèrer sur une autre image qui est ensuite copié sur une image vide avec ce script.

    
$img1 = imagecreatefromgif('url.gif');
$img = imagecreate(787,539);
imagecopy ($img, $img1, 0, 0, 3, 55, 787, 539 );

Devrais je utiliser imagecreatetruecolor ?

Merci pour vos réponses,amicalement.

Pour Duxmachine c'est le même code que au dessus :)

Ca c'est une partie avant :)

Modifié par snwoman49
Posté

Voilà je viens de tester en mettant l'image avec imagecreatetruecolor et ca marche.

Ca donne des index avec énormément de chiffres mais ca marche.

Bonne soirée et encore merci Duxmachine.

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...