Remplacer une couleur par une autre avec imagecolorset

Développeur PHP à Vendôme (41100) > Remplacer une couleur par une autre

Un éditeur vient de trouver l'ensemble parfait d'icônes pour son réseau de sites et doit maintenant créer une version pour chaque site, en adaptant les couleurs pour qu'elles s'intègrent bien aux différentes chartes graphiques. il n'y a "plus qu'à". Sauf que voilà, si remplacer une couleur par une autre est en théorie simple à faire avec n'importe quel logiciel d'infographie (The Gimp, Photoshop etc.), dans la pratique, ce n'est souvent pas une partie de plaisir.

imagecolorset

Pour peu que l'on ait quelques notions de PHP, la fonction imagecolorset peut alors être d'un grand secours, cette dernière ayant précisément été conçue pour remplacer une couleur par une autre. Elle est basée sur cinq arguments:

  • Image à traiter
  • Couleur à remplacer au format hexadécimal (XXXXXX)
  • Nouvelle couleur au format RVB - R
  • Nouvelle couleur au format RVB - V
  • Nouvelle couleur au format RVB - B

Une fois n'est pas coutume, imagecolorset n'est pas une fonction autonome, elle doit être associée à la fonction imagecolorclosest qui localise au préalable les emplacements de la couleur à remplacer, ou faute de mieux, de la couleur la plus proche. Le principe de ce binôme est donc le suivant: imagecolorclosest trouve / imagecolorset remplace. Il faut quatre arguments à imagecolorclosest:

  • Image à traiter
  • Couleur à trouver au format RVB - R
  • Couleur à trouver au format RVB - V
  • Couleur à trouver au format RVB - B

Remplacer une couleur par une autre

Partons du principe qu'il y a donc un ensemble d'icônes à adapter aux couleurs de plusieurs sites et créons un programme pour automatiser cette tâche.

La première étape consiste à créer un dossier pour accueillir le programme, son nom n'ayant aucune importance. À l'intérieur de ce dossier, on crée un fichier index.php pour le code et deux sous-dossiers, le premier pour les icônes génériques, le second pour les icônes générées, appelons-les "icones-generiques" et "icones-generees". Ne pas oublier de mettre les dossiers en écriture.

Attention: le code ci-dessous utilise la fonction maison hex_rvb disponible sur ce site.

Les icônes à modifier sont ici au format PNG, si ce code devait être utilisé pour des icônes au format GIF ou JPEG, il faudra naturellement remplacer les fonctions imagecreatefrompng et imagepng par leurs corollaires (imagecreatefromgif / imagegif ou imagecreatefromjpeg / imagejpeg).


<?php

//listage de tous les sites avec pour chacun la nouvelle couleur des icônes au format hexadécimal
$sites = array('site1.com' => 'CCCCCC','site2.com' => 'EAEAEA','site3.com' => 'FFFFFF');

//couleur à remplacer au format RVB
$rvb = hex_rvb('000000');
$rvb = explode(',',$rvb);

//lecture de tous les sites
while(list($site, $nouvelle_couleur) = each($sites)){

//création d'un dossier spécifique au site pour y enregistrer ses icônes s'il n'existe pas
if(!is_dir('icones-generees/'.$site)){

mkdir('icones-generees/'.$site);

}

//conversion de la nouvelle couleur des icônes au format RVB
$rvb_ = hex_rvb($nouvelle_couleur);
$rvb_ = explode(',',$rvb_);

//lecture de toutes les icônes
$icones = opendir('icones-generiques');

while($icone = readdir($icones)){

if($icone != '.' && $icone != '..'){

//récupération de l'icône en cours
$icone_gd = imagecreatefrompng('icones-generiques/'.$icone);

for($z=0;$z<1000;$z++){

//recherche de la couleur à remplacer dans l'icône
$remplacer = imagecolorclosest($icone_gd, $rvb[0], $rvb[1], $rvb[2]);

//remplacement de la couleur
imagecolorset($icone_gd, $remplacer, $rvb_[0], $rvb_[1], $rvb_[2]);

}

//enregistrement de l'icône modifiée dans le dossier du site
imagepng($icone_gd,'icones-generees/'.$site.'/'.$icone);

}

}

}

?>

Par , publié sur feu-sacre.net le 14-03-2019

Commentaires des internautes

Cliquer ici pour publier un commentaire (aucune inscription requise).