Michi: Thumbnail-Problem

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;  
  }  
  

  1. 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

    --
    RFC 1925, Satz 6: Es ist einfacher, ein Problem zu verschieben (...), als es zu lösen.
    1. 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

  2. Hi,
    hast Du bei den test, bei denen es geklappt hat, die selben Bilder verwendet?

    Siehe hier

    Gruß
    Wizard

  3. 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

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de