Lorsque vous utilisez PHP pour le traitement d'image, la fonction ImageColorResolve () apparaît souvent dans des scènes qui traitent les images de palette. Cependant, lorsque de nombreux développeurs utilisent cette fonction, ils se demandent souvent: ** Quelle est la différence dans leur comportement dans les images 24 bits (TrueColor) et les images 8 bits (palette)? ** Aujourd'hui, nous parlerons de ce problème en profondeur.
Tout d'abord, introduisons brièvement ImageColorResolve () . La fonction de cette fonction est:
Trouvez si la couleur spécifiée existe déjà dans une image de palette. S'il existe, renvoyez l'index de couleur; S'il n'existe pas, il essaie d'ajouter cette couleur à la palette et renvoie un nouvel index.
Exemples d'utilisation de base:
<?php
// Créer une image 8 Image de palette bits
$image = imagecreate(100, 100);
// Définition du rouge
$red = imagecolorresolve($image, 255, 0, 0);
// Dessinez un rectangle avec cette couleur
imagefilledrectangle($image, 10, 10, 90, 90, $red);
// Image de sortie
header('Content-Type: image/png');
imagepng($image);
// Détruire les ressources
imagedestroy($image);
?>
Ici, si le rouge existe déjà dans la palette, ImageColorResolve () renvoie l'indice de couleur existant; Sinon, il ajoutera automatiquement du rouge à la palette.
Lorsque vous créez une image TrueColor 24 bits avec ImageCreateTrueColor () , l'image elle-même n'a pas de palette . Chaque pixel peut stocker indépendamment les valeurs de couleur RVB.
La question est donc: que se passe-t-il si vous appelez ImageColorResolve () sur l'image TrueColor?
La réponse est:
Même si vous appelez ImageColorResolve () , PHP ne recherche pas ou ne ajoute pas vraiment des index de couleur, mais renvoie un entier calculé à partir des valeurs RGB (c'est-à-dire l'identification des couleurs).
Par exemple:
<?php
// Créer une image 24 Peu TrueColor image
$image = imagecreatetruecolor(100, 100);
// Définir le bleu
$blue = imagecolorresolve($image, 0, 0, 255);
// Dessinez un rectangle avec cette couleur
imagefilledrectangle($image, 10, 10, 90, 90, $blue);
// Image de sortie
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
?>
Ici $ bleu est un entier (disons 255 ), pas un index de couleurs. Dans ce mode, vous n'avez même pas à vous soucier de l'existence de la couleur, car chaque pixel peut enregistrer séparément les informations RVB complètes.
Dans une image 8 bits (créée par ImageCreate () ), les couleurs de l'image sont limitées, avec seulement 256 couleurs tout au plus.
Par conséquent, lorsque ImageColorResolve () est appelé, PHP sera:
Itérer dans toute la palette de couleurs pour voir si la couleur spécifiée existe déjà.
S'il est présent, renvoyez son index.
Si ce n'est pas présent, ajoutez à la palette (si l'espace est suffisant).
Si la palette est pleine, renvoyez l'index de la couleur existante la plus proche de la couleur spécifiée.
C'est aussi pourquoi parfois les images 8 bits sont sujets à la distorsion des couleurs lors du traitement des images complexes - parce que les couleurs sont "approximatives".
Exemple:
<?php
$image = imagecreate(100, 100);
// Essayez d'ajouter des couleurs qui dépassent la limite de palette
for ($i = 0; $i < 300; $i++) {
$color = imagecolorresolve($image, rand(0,255), rand(0,255), rand(0,255));
}
// Générer une image,Pour la visualisation
header('Content-Type: image/png');
imagepng($image);
// Version de ressources
imagedestroy($image);
?>
Dans le code ci-dessus, bien que 300 couleurs différentes aient été essayées d'ajouter, il n'y aura que jusqu'à 256 couleurs dans l'image, et l'excès sera "approximativement adapté".
Type d'image | ImageColorResolve () Description du comportement |
---|---|
TrueColor 24 bits | Renvoie une valeur de couleur (int), sans utiliser de palette |
Image de palette de couleurs 8 bits | Trouver ou ajouter des index de couleur, limités à 256 couleurs |
Par conséquent, pour résumer:
Dans les images 24 bits, ImageColorResolve () n'est pas si nécessaire. Vous pouvez utiliser ImageColorAllocate () directement ou construire la couleur vous-même.
Dans les images 8 bits, il est très important, surtout lorsque vous devez contrôler le nombre et la distribution de la couleur de l'image.
Si vous rencontrez fréquemment une carence en couleur lors du traitement des images 8 bits, vous pouvez envisager d'appeler ImageCreateTrueColor () avant de générer l'image, puis de convertir l'image TrueColor en une image de palette en utilisant l'imageTrueColortOpalette () selon les besoins. PHP optimisera automatiquement la couleur.
Exemple de référence de code: