Lorsque vous utilisez PHP pour le traitement d'image, la fonction ImageCreateFromgd2 () peut être utilisée pour charger des images au format GD2. Cependant, cette fonction peut facilement provoquer une mémoire insuffisante (telle que l'erreur de «taille de mémoire autorisée») lors de la gestion de grandes images ou dans des environnements à mémoire de mémoire. Cet article explorera certaines stratégies d'optimisation pour réduire l'utilisation de la mémoire de ImageCreatefromGD2 () à l'exécution et améliorer la stabilité du programme.
ImageCreateFromgd2 () décodera l'image entière dans une ressource Gdimage . Dans ce processus:
Le contenu de l'image sera entièrement chargé dans la mémoire ;
La bibliothèque GD créera une table de mappage de pixels complète en interne ;
Pour les images avec des canaux transparents, des informations de transparence supplémentaires sont nécessaires.
Ces facteurs se superposent, ce qui fait que l'utilisation de la mémoire monte rapidement lors du chargement des images à haute résolution. Par exemple, une véritable image couleur (couleur 24 bits) de 3000x2000 pixels peut nécessiter près de 20 Mo de mémoire.
Utilisez ini_set () ou définissez manuellement un capuchon de mémoire plus grand en haut du script (à condition que le serveur le permette):
ini_set('memory_limit', '256M');
?? Remarque: Ce n'est pas une méthode d'optimisation, il évite simplement que le programme se bloque directement. L'optimisation réelle consiste à réduire le volume d'image ou les méthodes de chargement alternatives.
Avant d'utiliser ImageCreateFromgd2 () , taillez autant que possible l'image d'origine. Vous pouvez utiliser d'autres outils d'image (tels que ImageMagick) pour compresser d'abord la grande image à une taille raisonnable, puis le charger avec GD.
Alternativement, utilisez l'outil de mise à l'échelle de l'image fourni par PHP pour évoluer immédiatement après le chargement pour réduire le fardeau de la mémoire:
$srcImage = imagecreatefromgd2('https://m66.net/images/bigimage.gd2');
$dstWidth = imagesx($srcImage) / 2;
$dstHeight = imagesy($srcImage) / 2;
$dstImage = imagescale($srcImage, $dstWidth, $dstHeight);
imagedestroy($srcImage);
Le fichier GD2 lui-même prend en charge les formats compressés et non compressés. S'il s'agit d'un format non compressé, les données peuvent être analysées dans des segments en théorie, mais l'image de PHP NativeCreatefromgd2 () ne prend pas en charge le streaming.
Une solution de contournement consiste à éviter d'utiliser le format GD2 et à passer à JPEG ou PNG, car ces deux formats sont plus courants, plus traités à maturité et ont une meilleure efficacité de compression.
Évitez les appels fréquents vers ImageCreateFromgd2 () , et vous pouvez mettre en cache les résultats de traitement en tant que fichiers intermédiaires, par exemple:
$cacheFile = '/tmp/cache_image.jpg';
if (!file_exists($cacheFile)) {
$srcImage = imagecreatefromgd2('https://m66.net/images/bigimage.gd2');
imagejpeg($srcImage, $cacheFile, 85); // Convertir et compresser en JPEG cache
imagedestroy($srcImage);
}
$img = imagecreatefromjpeg($cacheFile);
Cela ne réduit pas seulement l'utilisation de la mémoire, mais améliore également la vitesse de chargement.
GD2 n'est pas un format d'échange d'images commun, mais est principalement conçu pour l'utilisation interne de la bibliothèque GD. Si vous avez l'option, il est fortement recommandé de passer aux formats PNG, JPEG ou WebP. Ils ont:
Efficacité de compression plus élevée;
compatibilité plus large;
Meilleure performance.
Exemple de conversion GD2 en PNG: