Zur Navigation

Problem beim mehrfachen verkleinern von Bildern

1 AndiN

Guten morgen allerseits,

ich sitze momentan über einem Bild-Upload-Script.
Das Script soll ein Bild auf den Webserver laden, und dort zwei unterschiedliche große Versionen erstellen.

Das funktioniert auch prima.
Allerdings leider nur mit Bildern mit einer Dateigröße unter 50 kByte.
Bei größeren Bildern sagt er mir "Fatal error: Allowed memory size of 41943040 bytes exhausted (tried to allocate 2580 bytes) in ...".

Lasse ich nur einmal verkleinern geht es auch mit 1 MByte großen Bildern.
Meine Vermutung ist, dass er das hochgeladene Bild mehrfach erstellt und den Speicher dazwischen nicht freigibt.
Da er das unkomprimiert tut stoße ich bei einer Upload size in der php.ini von 40 M natürlich schnell an eine Grenze.

Meine Frage ist also wie ich es hinbekomme, dass er nach dem ersten Verkleinern den Speicher wieder freigibt und dann erst die anderen beiden Komprimierungen durchführt.

Anbei ein wenig Quellcode (die IF-Abfragen um zu verhindern, dass er zu kleine Bilder vergrößert habe ich hier weggelassen):

$timestamp = time();
$dest1 = $timestamp.".jpg";

//ANFANG: 150px grosse Bilder generieren
$bildinfo_thumb_klein = GetImageSize($tmpbild);
$bildtyp_thumb_klein = $bildinfo_thumb_klein[2];
$hoehe2_thumb_klein = 150*$bildinfo_thumb_klein[1]/$bildinfo_thumb_klein[0];
$neuesBild_thumb_klein=imagecreatetruecolor(150,$hoehe2_thumb_klein);
$dest_thumb_klein = $_SERVER['DOCUMENT_ROOT']."img/thumbnails_klein/".$dest1;
copy($tmpbild,$dest_thumb_klein);
$altesBild_thumb_klein=imagecreatefromjpeg($dest_thumb_klein);
imagecopyresampled($neuesBild_thumb_klein,$altesBild_thumb_klein,0,0,0,0,150,$hoehe2_thumb_klein,$bildinfo_thumb_klein[0],$bildinfo_thumb_klein[1]);
imagejpeg($neuesBild_thumb_klein,$dest_thumb_klein,80);
clearstatcache();
//ENDE: 150px grosse Bilder generieren

//ANFANG: 350px grosse Bilder generieren
$bildinfo_thumb = GetImageSize($tmpbild);
$bildtyp_thumb = $bildinfo_thumb[2];
$hoehe2_thumb = 350*$bildinfo_thumb[1]/$bildinfo_thumb[0];
$neuesBild_thumb=imagecreatetruecolor(350,$hoehe2_thumb);
$dest_thumb = $_SERVER['DOCUMENT_ROOT']."img/thumbnails/".$dest1;
copy($tmpbild,$dest_thumb);
$altesBild_thumb=imagecreatefromjpeg($dest_thumb);
imagecopyresampled($neuesBild_thumb,$altesBild_thumb,0,0,0,0,350,$hoehe2_thumb,$bildinfo_thumb[0],$bildinfo_thumb[1]);
imagejpeg($neuesBild_thumb,$dest_thumb,80);
clearstatcache();
//ENDE: 350px grosse Bilder generieren

//ANFANG: 645 grosse Bilder generieren
$bildinfo = GetImageSize($tmpbild);
$bildtyp = $bildinfo[2];
$hoehe2 = 645*$bildinfo[1]/$bildinfo[0];
$neuesBild=imagecreatetruecolor(645,$hoehe2);
$dest = $_SERVER['DOCUMENT_ROOT']."img/".$dest1;
copy($tmpbild,$dest);
$altesBild=imagecreatefromjpeg($dest);
imagecopyresampled($neuesBild,$altesBild,0,0,0,0,645,$hoehe2,$bildinfo[0],$bildinfo[1]);
imagejpeg($neuesBild,$dest,80);
clearstatcache();
//ENDE: grosses Bild generieren

10.03.2009 11:05

2 AndiN

ich habe jetzt mal vor jedem imagecreatefromjpeg($dest) per memory_get_usage() abgefragt wie viel Speicher den geradeso verbraucht wird.

Direkt vor dem ersten imagecreatefromjpeg($dest) sind es 1160344 Byte.
Direkt vor dem zweiten imagecreatefromjpeg($dest) sind es 22231288 Byte.
In der Zeile des zweiten imagecreatefromjpeg($dest) Aufrufes bricht er dann mit o.g. Fehlermeldung ab.

10.03.2009 11:35 | geändert: 10.03.2009 11:35

3 Jörg Kruse

Den Speicher kannst du zwischen den Vergrößerungen durch unset() vielleicht wieder freigeben:

unset($altesBild);
unset($neuesBild);

10.03.2009 12:14

4 AndiN

Hallo Jörg,
richtige Idee, aber falscher Befehl. Mit unset() scheint er nur die Variable zu löschen, aber nicht den belegten Bildspeicher freizugeben.

imagedestroy($altesBild);

Das hat jetzt - aufgerufen nach jedem clearstatcache() - den gewünschten Effekt gebracht. :)

Grüße,
Andreas

10.03.2009 12:29

Beitrag schreiben (als Gast)

Die Antwort wird nach der Überprüfung durch einen Moderator freigeschaltet.





[BBCode-Hilfe]