Lorsque vous utilisez PHP pour traiter les images, ImageColorResolve () est une fonction très pratique et sa fonction est. Si la couleur correspondante exacte est trouvée, l'index de couleur sera renvoyé; S'il ne peut être trouvé, l'index de la couleur la plus proche sera retourné. Ceci est très important lors de la création d'images basées sur des palettes (comme le format GIF).
Cependant, les performances de l'imageColorResolve () sont largement affectées par l'algorithme de recherche de couleurs . Comprendre cela est particulièrement critique pour optimiser les programmes de traitement d'image.
Lorsque ImageColorResolve () est appelé, la logique derrière PHP est à peu près:
Itérer à travers toutes les couleurs de la palette d'images.
Calculez la "distance" entre chaque couleur et la couleur cible.
Trouvez la couleur avec la plus petite distance et renvoyez son index.
Le calcul de la distance est généralement basé sur la formule de distance euclidienne , comme:
$distance = sqrt(
pow($r1 - $r2, 2) +
pow($g1 - $g2, 2) +
pow($b1 - $b2, 2)
);
Où R1 / $ G1 / $ B1 est la valeur RVB de la couleur de la palette, et $ R2 / G2 / $ B2 est la couleur cible que vous recherchez.
Parce qu'il traversera l'ensemble de la palette , plus la palette est grande, plus les frais généraux de performance et plus la vitesse.
Il y a deux goulets d'étranglement principaux:
Traversal complet : chaque recherche nécessite de scanner toutes les couleurs de la palette, sans mécanisme d'accélération.
La quantité de calcul est grande : chaque couleur nécessite plusieurs ajouts, soustractions, multiplications, opérations carrées et cette opération à virgule flottante elle-même est relativement consommée par le processeur.
S'il n'y a que 16 couleurs dans la palette, l'impact des performances peut ne pas être ressenti. Mais s'il y a 256 couleurs, ou plus de 1000 couleurs, le temps d'exécution d' imageColorResolve () augmentera considérablement.
Dans certains sites Web qui génèrent dynamiquement un grand nombre de petites images (telles que les codes de vérification et la génération d'icônes dynamiques), une mauvaise utilisation peut devenir un goulot d'étranglement des performances.
Par exemple, l'exemple typique suivant:
$image = imagecreate(200, 200);
for ($i = 0; $i < 1000; $i++) {
$color = imagecolorresolve($image, rand(0,255), rand(0,255), rand(0,255));
imagesetpixel($image, rand(0,199), rand(0,199), $color);
}
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
Dans cet exemple, chaque fois que la couleur générée par Rand () est recherchée via la palette existante avec ImageColorResolve () . À mesure que $ j'augmente , le programme deviendra de plus en plus lent.
Taille de la palette limite : si possible, gardez la palette d'images aussi petite que possible, et il est préférable de ne pas dépasser 256 couleurs.
Couleurs de pré-attribution : utilisez ImageColorAllocate () pour attribuer manuellement les couleurs couramment utilisées pour éviter les recherches fréquentes.
Utilisez à la place True Color Images : si vous n'avez pas à utiliser une palette, la création d'une vraie image couleur (en utilisant ImageCreateTrueColor () ) utilisera directement les valeurs RGB sans rechercher.
Index de couleur du cache : Vous pouvez maintenir un cache d'index de couleur vous-même, comme une table de hachage, pour éviter les appels répétés vers ImageColorResolve () .
Par exemple:
$colorCache = [];
function resolveColorCached($image, $r, $g, $b) {
global $colorCache;
$key = "$r,$g,$b";
if (!isset($colorCache[$key])) {
$colorCache[$key] = imagecolorresolve($image, $r, $g, $b);
}
return $colorCache[$key];
}
De cette façon, la vitesse sera beaucoup plus rapide lors de la réutilisation de la même couleur.
ImageColorResolve () est une fonction très utile mais potentiellement sensible aux performances. Son algorithme de recherche est un simple calcul de distance linéaire à force brute + à distance euclidienne, ce qui ralentira considérablement le programme lorsque la palette est grande. Une fois que vous comprenez cela, vous pouvez optimiser les performances en limitant la taille de la palette, en cache les résultats de la recherche ou en utilisant directement des diagrammes de couleurs True.