Bei der Verwendung von PHP für die Bildverarbeitung kann die Funktion der ImagecreateFromgd2 () verwendet werden, um Bilder im GD2 -Format zu laden. Diese Funktion kann jedoch leicht zu einem unzureichenden Speicher (z. B. "zulässiger Speichergröße erschöpft" -Fehler) führen, wenn sie mit großen Bildern oder in regelmäßigen Umgebungen behandelt werden. In diesem Artikel werden einige Optimierungsstrategien untersucht, um die Gedächtnisverwendung von ImagecreateFromgd2 () zur Laufzeit zu verringern und die Stabilität des Programms zu verbessern.
ImagecreateFromgd2 () dekodiert das gesamte Bild in eine GDIMAGE -Ressource. In diesem Prozess:
Der Bildinhalt wird vollständig in den Speicher geladen .
Die GD -Bibliothek erstellt intern eine vollständige Pixel -Mapping -Tabelle .
Für Bilder mit transparenten Kanälen sind zusätzliche Transparenzinformationen erforderlich.
Diese Faktoren überlagern, was dazu führt, dass das Speicherverbrauch beim Laden hochauflösender Bilder schnell steigt. Beispielsweise kann ein echtes Farbbild (24-Bit-Farbe) von 3000 x 200.000 Pixel nahe 20 MB Speicher erforderlich sein.
Verwenden Sie INI_SET () oder stellen Sie manuell eine größere Speicherobergrenze oben im Skript (vorausgesetzt, dass der Server zulässt):
ini_set('memory_limit', '256M');
? HINWEIS: Dies ist keine Optimierungsmethode, sondern vermeidet nur das Programm, das direkt zum Absturz ist. Die tatsächliche Optimierung besteht darin, das Bildvolumen oder alternative Belastungsmethoden zu reduzieren.
Bevor Sie ImagecreateFromgd2 () verwenden, Größe das Originalbild so weit wie möglich. Sie können andere Bildwerkzeuge (z. B. Imagemagick) verwenden, um das große Bild zuerst zu einer vernünftigen Größe zu komprimieren und es dann mit GD zu laden.
Verwenden Sie alternativ das PHP-bereitgestellte Bildskalierungswerkzeug, um unmittelbar nach dem Laden zu skalieren, um die Speicherbelastung zu verringern:
$srcImage = imagecreatefromgd2('https://m66.net/images/bigimage.gd2');
$dstWidth = imagesx($srcImage) / 2;
$dstHeight = imagesy($srcImage) / 2;
$dstImage = imagescale($srcImage, $dstWidth, $dstHeight);
imagedestroy($srcImage);
Die GD2-Datei selbst unterstützt sowohl komprimierte als auch nicht komprimierte Formate. Wenn es sich um ein nicht komprimiertes Format handelt, können die Daten theoretisch in Segmenten analysiert werden, aber PHP Native ImagecreateFromgd2 () unterstützt kein Streaming.
Eine Problemumgehung besteht darin, die Verwendung des GD2 -Formats zu vermeiden und auf JPEG oder PNG umzusteigen, da diese beiden Formate häufiger und reifen verarbeitet werden und eine bessere Komprimierungseffizienz aufweisen.
Vermeiden Sie häufige Aufrufe bei ImagecreateFromgd2 () , und Sie können die Verarbeitungsergebnisse beispielsweise als Zwischendateien zwischenspeichern:
$cacheFile = '/tmp/cache_image.jpg';
if (!file_exists($cacheFile)) {
$srcImage = imagecreatefromgd2('https://m66.net/images/bigimage.gd2');
imagejpeg($srcImage, $cacheFile, 85); // Konvertieren und komprimieren zu JPEG Cache
imagedestroy($srcImage);
}
$img = imagecreatefromjpeg($cacheFile);
Dies reduziert nicht nur den Speicherverbrauch, sondern verbessert auch die Ladegeschwindigkeit.
GD2 ist kein gemeinsames Bildaustauschformat, sondern hauptsächlich für die interne Verwendung der GD -Bibliothek. Wenn Sie die Option haben, wird dringend empfohlen, auf PNG-, JPEG- oder WebP -Formate umzusteigen. Sie haben:
Höhere Kompressionseffizienz;
größere Kompatibilität;
Bessere Leistung.
Beispiel für die Konvertierung von GD2 in PNG: