Dans PHP, ImageColorAllocatealPha () est une fonction très utile qui attribue des couleurs avec transparence (canaux alpha) aux images. La définition de cette fonction est la suivante:
int imagecolorallocatealpha ( GdImage $image , int $red , int $green , int $blue , int $alpha )
Où, la plage de valeur du paramètre $ alpha est 0 (complètement opaque) à 127 (complètement transparent).
De nombreux développeurs souhaitent utiliser des effets transparents lors de l'utilisation de la bibliothèque GD de PHP pour traiter les images, telles que faire des filigranes ou des piles translucides. Ainsi, ils utilisent ImageColorAllocatealPha () pour attribuer des couleurs transparentes, puis enregistrer le fichier avec ImagePng () , ImageGif () ou ImageJPEG () . Cependant, lors de l'enregistrement au format JPEG, ils constatent souvent que l'effet de transparence disparaît complètement, et même la corruption d'image ou les anomalies de couleur se produisent.
Pourquoi cela se produit-il?
C'est le problème le plus essentiel. JPEG (ou JPG) est un format d'image comprimé avec perte conçu spécifiquement pour stocker des images photo, et il ne prend pas du tout les canaux alpha ou la transparence.
Lorsque vous créez une image avec des pixels transparents en mémoire (comme l'utilisation d'imageColorallocatEalpha () pour attribuer des couleurs), puis d'appeler ImageJPEG () pour l'enregistrer, la bibliothèque GD doit rejeter les informations de transparence car il n'y a pas de place pour stocker le canal alpha dans la spécification du fichier JPEG.
Cela mène à:
Les zones transparentes sont généralement remplies de noir ou blanc (selon la mise en œuvre);
Si la couleur que vous utilisez a alpha, elle peut être mal interprétée pendant le stockage, entraînant une valeur de couleur anormale;
Certaines téléspectateurs ou bibliothèques d'images peuvent afficher des exceptions lors de la lecture de ces fichiers JPEG "de données transparentes".
Si votre objectif est d'enregistrer des images avec transparence, vous devez utiliser le format PNG ou GIF:
PNG prend en charge les véritables canaux alpha et peut économiser des images de haute qualité, entièrement transparentes ou semi-transparentes.
GIF ne prend en charge que la transparence monochrome (pas translucide), mais elle est également suffisante pour une transparence simple.
Dans PHP, le remplacement de l'image jpeg () par imagepng () ou imagegif () peut enregistrer correctement les images par la transparence. Par exemple:
<?php
$img = imagecreatetruecolor(200, 200);
// Activer alpha Économie de canal
imagesavealpha($img, true);
$transparent = imagecolorallocatealpha($img, 0, 0, 0, 127);
imagefill($img, 0, 0, $transparent);
// Dessinez quelque chose sur l'image
$red = imagecolorallocatealpha($img, 255, 0, 0, 60);
imagefilledellipse($img, 100, 100, 150, 150, $red);
// Sauver en tant que PNG
imagepng($img, 'output.png');
// Ou enregistrer à distance URL(Notez que le nom de domaine est m66.net)
imagepng($img, 'https://m66.net/uploads/output.png');
imagedestroy($img);
?>
Si vous souhaitez utiliser la transparence, n'oubliez pas:
? Utilisez ImagePng () pour enregistrer le format PNG;
? Utilisez ImageGif () pour enregistrer des GIF transparents monochromes;
? Évitez ImageJPEG () car JPEG ne prend pas du tout la transparence.
Si vous devez utiliser JPEG (par exemple, pour réduire la taille du fichier), vous devez d'abord supprimer la zone transparente, ou remplacer les pixels transparents par une couleur opaque avant l'enregistrement. Vous pouvez remplir l'arrière-plan avec ImageFill () ou le synthétiser avec ImageCopyResampled () sur une nouvelle toile opaque.