knack: Bild verkleinern

Hallo,
habe mir ein Skript zusammengebastelt mit dem ich Bilder hochladen und dann verkleinern kann. Das geht bis 1,3 MB Bildgröße.

$src_img = imagecreatefromjpeg($Pfad1.'/'.$Bild);

$oh = imagesy($src_img);  # original Höhe
 $ob = imagesx($src_img);  # original Breite

ab dann bekomme ich folgende Fehlermeldung

Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 12532 bytes) in

wer weiß, warum das so ist und wo gibt es eine DEUTSCHE Beschreibung für diesen und ähnliche Befehle?

Danke im voraus für eure Hilfe
knack

  1. Hello,

    Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 12532 bytes) in

    Ein JPG-Bild ist komprimiert. Wenn dies nun sehr wenige Farben hat und eine starke Kompressionsstufe gewählt wurde, kann es beim Auspacken schon auf den 50 bis 100-fachen Speicherbedarf anwachsen.

    Du kannst Dich bei JPG-Dateien und bedingt auch bei den anderen davor schützen, dass der vorhandene Speicher überschritten wird, indem Du _vorher_ mit getimagesize()
    http://de.php.net/manual/en/function.getimagesize.php
    die Metadaten des Bildes auskliest und dann rechnest

    sizeX * sizeY * (3 + Sicherheit1) + Sicherheit2

    Das ist der Speicherbedarf, den Dein Bild mindestens verursacht.

    Wenn Du es dann umkopieren willst, benötigst Du für die Kopie selbstverstänlich auch nochmal diesen Speicher. Zusätzlich benötigt Dein Script noch Speicher und für jedes Arrayelement muss man auch noch einiges an Overhead (zwischen 80 und 180 Bytes) einplanen, falls Du gerade welche angelegt hast.

    Es gibt hier im Archiv einen Thread von mir, in dem ich unter Mithilfe der Anderen bemüht hatte, eine Speicherbedarfsschätzung für eben diesen Fall (Bilder bearbeiten) durchzuführen. Die Funktion hat "schon befriedigend" gearbeitet.

    Musst mal suchen.

    wer weiß, warum das so ist und wo gibt es eine DEUTSCHE Beschreibung für diesen und ähnliche Befehle?

    Für die Übersetzung empfehle ich http://dict.tu-chemnitz.de/

    Ein harzliches Glückauf

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Hallo Tom vom Berg,

      mit
      echo memory_get_usage() . "\n";
      zeige ich den belegten Speicher an.

      Wie bekomme ich den freien Speicher?

      Gruß knack

      1. Hello,

        mit
        echo memory_get_usage() . "\n";
        zeige ich den belegten Speicher an.

        Wie bekomme ich den freien Speicher?

        Gute Frage.
        Den freien Speicher bekommst Du bzw. Dein Script i.d.R. gar nicht, sondern nur den zugeteilten. Und den kannst Du abfragen mit ini_get('memory_limit')
        http://de.php.net/manual/en/function.ini-get.php

        Es kann auch durchaus bei einem Hoster möglich sein, den Speicher für das Script noch während der Scriptlaufzeit heraufzusetzen. Dazu muss man dann ggf. ini_set() benutzen oder man versucht es in einer .htaccess-Datei

        php_value memory_limit 67108864

        Ein harzliches Glückauf

        Tom vom Berg

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

    Hallo,
    habe mir ein Skript zusammengebastelt mit dem ich Bilder hochladen und dann verkleinern kann. Das geht bis 1,3 MB Bildgröße.

    Du meinst skalieren (verkleinern kann sich auf vieles beziehen)?

    ab dann bekomme ich folgende Fehlermeldung

    Ab wann? imagesx() oder irgendwas folgendem, das wir nicht kennen? Poste den ganzen Code.

    Gruß

    1. Hallo,

      <?php
      $Pfad = '../uploads/temp/'.$_SESSION['MM_CO'].'.jpg';
      $ok = 'nein'; $falsch = 'ja'; $nurJPG = 'ja';

      $Speicher = memory_get_usage() . "\n";  # freier RAM Speicher
      $Speicher = '3096000';

      $dateityp = getimagesize($_FILES['datei']['tmp_name']);
      if($dateityp[2] != 0 and $dateityp[2] == 2)
         {

      if($_FILES['datei']['size'] <  $Speicher)
           {
           move_uploaded_file($_FILES['datei']['tmp_name'], $Pfad);
           $ok = 'ja';
           }
          else
           {
            $falsch = 'nein';
           }
          }

      else
          {
       $nurJPG = 'nein';
          }
      ?>

      <?php
       if( $ok == 'ja' ) #  ANFANG if( $ok == 'ja' )
      {
       $bild_ok = 'nein';

      $Bild = $_SESSION['MM_CO'].'.jpg'; # bildname
       $Pfad1 = '../uploads/temp'; # von wo?
       $Pfad2 = '../uploads'; # nach wo
       $max_b = 158;     # maximale Breite des Bildes
       $max_h = 200;  # maximale Höhe des Bildes

      #  $src_img = LoadJpeg($Pfad1.'/'.$Bild);
       $src_img = imagecreatefromjpeg($Pfad1.'/'.$Bild);

      $oh = imagesy($src_img);  # original Höhe
       $ob = imagesx($src_img);  # original Breite

      if ( $oh > $max_h and $ob > $max_b ) # ANFANG   if   Bilder, größer als $max
       {

      # Breite > Höhe
        if( $ob > $oh ) #  ANFANG if( $ob > $oh )
        {
         $neu_b = $max_b;
         $neu_h =  $oh / ($ob / $max_b);
         if ( $neu_h > $max_b ){$neu_h = $max_h; $neu_b =  $ob / ($oh / $max_h);}
        }#  ENDE if( $ob > $oh )

      # Höhe > Breite
        if( $oh > $ob ) #  ANFANG if( $oh > $ob )
        {
         $neu_h = $max_h;
         $neu_b =  $ob / ($oh / $max_h);
         if ( $neu_b > $max_b ) {$neu_b = $max_b; $neu_h =  $oh / ($ob / $max_b);}
        }#  ENDE ANFANG if( $oh > $ob )

      # QUADRAT
        if( $oh == $ob and $ob > $max_b) #  ANFANG if( $oh == $ob )
        {
         $neu_b = $max_b;
         $neu_h = $max_b;
        }#  ENDE ANFANG if( $oh == $ob )

      }  # ENDE  if   Bilder, größer als $max
       else
       { # ANFANG  else    Bilder, größer als $max ( Bild ist kleiner als max )
        $neu_b = $ob;
        $neu_h = $oh;
       }# ENDE  else    Bilder, größer als $max  ( Bild ist kleiner als max )

      $dst_img = imagecreatetruecolor($neu_b,$neu_h);
       // imagecopyresized erzeugt schlechteres Bild als imagecopyresampled
       imagecopyresampled($dst_img, $src_img, 0,0,0,0, $neu_b, $neu_h, imagesx($src_img), imagesy($src_img));

      imagejpeg($dst_img, $Pfad2.'/'.$Bild);

      # Datei in temp löschen
       unlink ($Pfad1.'/'.$Bild);

      $bild_ok = 'ja';
      }  #  ENDE if( $ok == 'ja' )
      ?>

      imagecreatefromjpeg sammelt doch nur Informationen von der Datei!?

      knack

      1. Hallo,

        imagecreatefromjpeg sammelt doch nur Informationen von der Datei!?

        Offensichtlich lädt diese Funktion das ganze Bild und entpackt es ggf. in den Speicher => siehe Toms Beitrag.

        Gruß