AllesMeins: Arbeitsspeicherverbrauch von imagecreatefromjpeg()

Hi,

ich habe folgendes Problem. Ich versuche gerade bei einem neuen Hoster eines meiner Scripte zum laufen zu bringen. Dieses Script soll aus einer JPEG Datei eine Thumbnail-Version generieren und diese auf dem Server speichern. Nun scheitert dieses am vom Provider eingestellten Memory-Limit:

Fatal error: Allowed memory size of 41943040 bytes exhausted (tried to allocate 16000 bytes) in /irgend/ein/pfad/test.php on line 4

Das betreffende Ausgangsbild ist etwa 490KB groß. Mein Test-Script sieht derzeit so aus.

test.php:
<?php

$datei = "bild.jpg";
 $quelle = imagecreatefromjpeg($datei);
 imagejpeg($quelle);
?>

Nun meine Frage: Ist es normal, das ein 490KB großes Bild schon beim laden mir das Speicherlimit sprengt (das ja immerhin laut Fehlermeldung bei 5 MB liegt)? Und vor allem, wie komme ich um dieses Problem herum? Gibt es irgend eine irgendwie speichersparendere Version? Gibt es eine andere Möglichkeit um Bilder zu verkleinern, die vielleicht nicht solche Probleme macht?

Grüße

Marc

  1. Hallo Marc,

    Fatal error: Allowed memory size of 41943040 bytes exhausted (tried to allocate 16000 bytes) in /irgend/ein/pfad/test.php on line 4
    Das betreffende Ausgangsbild ist etwa 490KB groß.

    die Dateigröße ist weniger interessant. Viel spannender sind die Abmessungen (Anzahl der Pixel), weil PHP das Bild zum Bearbeiten unkomprimiert im Arbeitsspeicher hält.

    Nun meine Frage: Ist es normal, das ein 490KB großes Bild schon beim laden mir das Speicherlimit sprengt (das ja immerhin laut Fehlermeldung bei 5 MB liegt)?

    Nein, eigentlich nicht, zumal das Speicherlimit aus deinem Beispiel nicht 5MB beträgt, sondern 40MB. Das reicht locker für ein 4000x3000-Bild in Truecolor!
    Bist du sicher, dass der Speicherbedarf deines Scripts nicht andere Gründe hat? Versuchst du eventuell, das Bild mehrmals zu laden? Oder mehrere Bilder gleichzeitig? Anders kann ich mir das nämlich kaum vorstellen.

    So long,
     Martin

    --
    In Ägypten haben früher 150000 Leute 35 Jahre lang an einer Pyramide gearbeitet. Aber bei uns arbeiten doppelt so viele Leute doppelt so lange allein an der Baugenehmigung.
      (Dieter Nuhr, deutscher Kabarettist)
    1. Hi,

      die Dateigröße ist weniger interessant. Viel spannender sind die Abmessungen (Anzahl der Pixel), weil PHP das Bild zum Bearbeiten unkomprimiert im Arbeitsspeicher hält.

      4000 x 2295 Pixel

      Nein, eigentlich nicht, zumal das Speicherlimit aus deinem Beispiel nicht 5MB beträgt, sondern 40MB. Das reicht locker für ein 4000x3000-Bild in Truecolor!

      Ups, stimmt, sind ja bytes und keine bits, die in der Fehlermeldung angegeben werden ;)

      Bist du sicher, dass der Speicherbedarf deines Scripts nicht andere Gründe hat?

      Das Beispielscript war das komplette Script, das ich laufen lassen habe. Also wirklich nur Name der Datei definiert und dann imagecreatefromjpeg();

      Marc

      1. Hallo,

        4000 x 2295 Pixel

        uiiii... das sind also grob über'n Daumen gepeilt 27MB. Sollte eigentlich reichen. Allerdings weiß ich nicht, ob PHP beim Ausgeben des Bildes, also beim Erzeugen der JPEG-Daten aus dem unkomprimierten Bild im RAM, noch weiteren Arbeitsspeicher braucht.
        Wer braucht eigentlich Bilder mit solchen Ausmaßen?

        Ups, stimmt, sind ja bytes und keine bits, die in der Fehlermeldung angegeben werden ;)

        Eben. :-)

        Das Beispielscript war das komplette Script, das ich laufen lassen habe. Also wirklich nur Name der Datei definiert und dann imagecreatefromjpeg();

        Okay, dann muss es wirklich der zusätzliche Speicherbedarf des PHP-Interpreters beim Verarbeiten der Bilddaten sein.

        Ciao,
         Martin

        --
        why the heck do you jerk think, that wir ein doppelposting nicht bemerken, wenn you zwischendurch the sprache wechselst?
          (wahsaga)
        1. Hi,

          Wer braucht eigentlich Bilder mit solchen Ausmaßen?

          Niemand, unter anderem deswegen will ich sie ja verkleinern lassen ;)
          Aber wies ausschaut werde ich das dann wohl manuell machen müssen...

          Allerdings weiß ich nicht, ob PHP beim Ausgeben des Bildes, also beim Erzeugen der JPEG-Daten aus dem unkomprimierten Bild im RAM, noch weiteren Arbeitsspeicher braucht.

          Mag sein, ist aber nicht das Problem. Das Script scheitert auch ohne die Ausgabe-Funktion.

          Marc

          1. n'abend,

            Niemand, unter anderem deswegen will ich sie ja verkleinern lassen ;)
            Aber wies ausschaut werde ich das dann wohl manuell machen müssen...

            schau mal ob dein Hoster imagemagick (oder was ähnliches) installiert hat.

            <?php  
            /*  
             * dieser test wird nur funktionieren, wenn du auf  
             * system-komponenten zugreifen kannst.  
             * kannst du das nicht, kannst du auch kein imagemagick verwenden  
             */  
              
            $a = exec('which convert');  
            echo 'ImageMagick - path to convert: '.(($a != '')? $a:'<b>not installed :(</b>').'<br>';  
            ?>
            

            imagemagick ist zwar langsamer als die in PHP integrierte GDlib, erzielt dafür aber qualitativ bessere Ergebnisse, kann mehr und stört sich nicht an PHPs Speichergrenze.

            Mit ImageMagick zu arbeiten wird dir garantiert etwas schwerer fallen...

            weiterhin schönen abend...

            --
            wer braucht schon großbuchstaben?
            sh:( fo:# ch:# rl:° br:> n4:& ie:{ mo:} va:) de:] zu:} fl:{ ss:? ls:[ js:|
        2. Tach.

          4000 x 2295 Pixel

          uiiii... das sind also grob über'n Daumen gepeilt 27MB. Sollte eigentlich reichen.

          Ein kurzer Blick in die Kommentare zur Dokumentation von imagecreatefromjpeg() zeigt, daß sich der benötigte Speicher nicht allein aus der Bildgröße und Farbtiefe errechnen läßt. Die Funktion scheint etwas gefräßiger zu sein.

          --
          Once is a mistake, twice is jazz.