Thumbnail-Problem
Michi
- php
Hallo,
folgender Code, und im Speziellen die Zeile - $image = imagecreatefromjpeg($folder_scr."/".$img_src); - verursacht folgenden Fehler: Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 11200 bytes) in ...
Ich blick da nicht so richtig durch...den das memory limit in der php.ini beträgt 16mb... das größte bild hat 644kb und alle gemeinsam nur 2,5mb. abgesehen davon hab ich das skript letzte woche ohne probleme mit bildern bis zu 3,5 mb pro bild getestet und seitdem nichts verändert...
bitte um hilfe, lg michi
function mkthumb($img_src, // Dateiname
$folder_scr, // Ordner der normalen Bilder
$des_src, // Ordner der Thumbs
$img_width = "130", // max. Größe in x-Richtung
$img_height = "130") // max. Größe in y-Richtung
{
$image = imagecreatefromjpeg($folder_scr."/".$img_src);
list($src_width, $src_height) = getimagesize($folder_scr."/".$img_src);
if($src_width >= $src_height)
{
$new_image_width = $img_width;
$new_image_height = $src_height * $img_width / $src_width;
}
if($src_width < $src_height)
{
$new_image_height = $img_width;
$new_image_width = $src_width * $img_height / $src_height;
}
$new_image = imagecreatetruecolor($new_image_width, $new_image_height);
imagecopyresampled($new_image, $image, 0, 0, 0, 0, $new_image_width,$new_image_height, $src_width, $src_height);
imagejpeg($new_image, $des_src."/".$img_src, 100);
RETURN TRUE;
}
Wesentlich ist nicht die gepackte Größe des Bildes, sondern die entpackte Größe, die es im Speicher einnimmt. Dabei musst Du folgendes berechnen:
Pixel vertikal x Pixel horizontal x Bytes pro Kanal
bspw.
1024 * 768 px * 4 bytes/px = 3145728 bytes im Speicher
Bei entsprechend größeren Bildern und schon vorhandener Speicherbelegung kann das für PHP schnell zu viel werden.
Gruß, LX
Wesentlich ist nicht die gepackte Größe des Bildes, sondern die entpackte Größe, die es im Speicher einnimmt. Dabei musst Du folgendes berechnen:
Pixel vertikal x Pixel horizontal x Bytes pro Kanal
bspw.
1024 * 768 px * 4 bytes/px = 3145728 bytes im Speicher
Danke, das erklärt es natürlich!
michi
Hi,
hast Du bei den test, bei denen es geklappt hat, die selben Bilder verwendet?
Siehe hier
Gruß
Wizard
Hello,
ich ahbe mich damit schon mal länger auseinandergesetzt.
Das ist zwar eher empirisch entstanden, denn exakte und verbriefte Angaben konnte ich bisher nicht finden für die Bildtypen.
http://forum.de.selfhtml.org/archiv/2008/3/t168961/#m1102978
#---------------------------------------------------
function image_check_memory($_imageinfo, $memleft = MEMORY_LEFT) ## X, Y, bits, channels
{
## fehlende Angaben durch Raten ergänzen
if (!isset($_imageinfo['bits'])) $_imageinfo['bits'] = 8;
if (!isset($_imageinfo['channels']) and $_imageinfo['bits'] == 24) $_imageinfo['channels'] = 1;
if (!isset($_imageinfo['channels'])) $_imageinfo['channels'] = 3;
$memoryNeeded = round(($_imageinfo[0] * $_imageinfo[1] * $_imageinfo['bits'] * $_imageinfo['channels'] / 8 + 65536) * 1.65);
$memoryLimit = intval(ini_get('memory_limit')) * 1048576;
if ((memory_get_usage() + $memoryNeeded) + $memleft > $memoryLimit)
{
error_log('IMAGE_MEMORY usage: '.memory_get_usage().", needed: $memoryNeeded, limit: $memoryLimit\n", 3, '/var/log/web04/php_error_log');
return false;
}
return true;
}
#---------------------------------------------------
und eine weitere Funktion:
#---------------------------------------------------
function get_memory_limit()
{
$memory_limit_str = ini_get('memory_limit');
$memval = intval($memory_limit_str);
if ($memval == -1) return MAX_MEMORY;
if (stripos($memory_limit_str, 'K'))
{
return $memval * 1024;
}
elseif(stripos($memory_limit_str, 'M'))
{
return $memval * 1024 * 1024;
}
elseif(stripos($memory_limit_str, 'G'))
{
return $memval * 1024 * 1024 * 1024;
}
return $memval;
}
#--------------------------------------------------
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg