Benötigen Arbeitsspeicher berechnen beim Umgang mit Bildern
Verfasst: 07.07.2007 18:59
Hallo,
es gibt zwar hier und da Codeschnippsel, doch keiner davon funktioniert wirklich bei jedem.
Ich habe z.B. herausgefunden, dass grauskalierte JPEGs eine Bittiefe von 8 haben, aber von GD mit 24 Bit abgearbeitet werden. Jedenfalls muss das so sein, da der benötigte Arbeitsspeicher sich im Bereich von 24 Bit abspielt. Daher habe ich eine Funktion geschrieben die möglichst genau den benötigten Speicher ermittelt.
Die Funktion prüft den aktuell genutzten Speicher (falls möglich) und addiert dazu den benötigten Speicher für das Erstellen eines Thumbnails. Sollte die Summe größer sein als der verfügbare Speicher, so wird versucht das Limit neu zu setzen. Funktioniert das nicht, dann resultiert die Funktion ein false.
Das ist auch der einzige Fall, wo ein Fehler resultiert.
Das wäre die Funktion, die man vor dem Erstellen eines Vorschaubildes (Thumbnail) aufrufen sollte:
z.B. so:
EDIT:
Ich habe soeben ein Bild von 40.000 Bildern insgesamt gehabt, dass den Arbeitsspeicher dennoch gesprengt hat. Daher habe ich den Faktor jetzt einfach von 1.65 auf 1.7 (siehe Code) geändert und damit wurde auch das Bild erfolgreich verkleinert.
Gruß
es gibt zwar hier und da Codeschnippsel, doch keiner davon funktioniert wirklich bei jedem.
Ich habe z.B. herausgefunden, dass grauskalierte JPEGs eine Bittiefe von 8 haben, aber von GD mit 24 Bit abgearbeitet werden. Jedenfalls muss das so sein, da der benötigte Arbeitsspeicher sich im Bereich von 24 Bit abspielt. Daher habe ich eine Funktion geschrieben die möglichst genau den benötigten Speicher ermittelt.
Die Funktion prüft den aktuell genutzten Speicher (falls möglich) und addiert dazu den benötigten Speicher für das Erstellen eines Thumbnails. Sollte die Summe größer sein als der verfügbare Speicher, so wird versucht das Limit neu zu setzen. Funktioniert das nicht, dann resultiert die Funktion ein false.
Das ist auch der einzige Fall, wo ein Fehler resultiert.
Das wäre die Funktion, die man vor dem Erstellen eines Vorschaubildes (Thumbnail) aufrufen sollte:
Code: Alles auswählen
function enough_memory($src_file)
{
$getimagesize = @getimagesize($src_file);
if ( $getimagesize && isset($getimagesize[0]) && isset($getimagesize[1]) && isset($getimagesize[2]) && isset($getimagesize['bits']) && isset($getimagesize['channels']) )
{
$memory_needed = ($getimagesize[0] * $getimagesize[1] * ($getimagesize[2] == IMG_JPG ? 24 : $getimagesize['bits']) * $getimagesize['channels'] / 8 + pow(2, 16)) * 1.7;
$memory_limit = intval(ini_get('memory_limit')) * pow(1024, 2); // if --disable-memorylimit is set this is 0
$memory_usage = 0;
if ( function_exists('memory_get_usage') )
{
$memory_usage = memory_get_usage();
}
if ( $memory_limit && ($memory_needed + $memory_usage) > $memory_limit )
{
// try to set a new limit
if ( !ini_set('memory_limit', ceil(($memory_needed + $memory_usage) / pow(1024, 2)) . 'M') )
{
return false;
}
}
return true;
}
return false;
}
Code: Alles auswählen
if ( enough_memory('images/bild.jpg')
{
// thumbnail erstellen
}
Ich habe soeben ein Bild von 40.000 Bildern insgesamt gehabt, dass den Arbeitsspeicher dennoch gesprengt hat. Daher habe ich den Faktor jetzt einfach von 1.65 auf 1.7 (siehe Code) geändert und damit wurde auch das Bild erfolgreich verkleinert.
Gruß