Steffen Flaemig: Bild beschneiden, Image::Magick ist zu langsam

Hallo,

ich möche aus einer relativ großen (4500 x 3000 Pixel) jpg Datei ein 800 x 600 Pixel Stück an variable Stelle herausschneiden und im Browser anzeigen.

Ich habe das jetzt mit Image::Magick ($image->Crop(geometry=>"800x600+$xOffset+$yOffset");) gemacht.

Es funktioniert an sich, braucht aber schon auf meinem PC (1,5 GHz) ca. 5 Sekunden, die CPU-Auslastung ist dabei nach Task-Manager 100%.

Wenn ich das jetzt auf einen (virtuellen) Server neben einigen anderen Prozessen laufen lasse, wird es sicher unbrauchbar langsam.

Kennt jemand eine schneller Methode ein jpg zu beschneiden?

Nach  meinen bescheidenen jpg Kenntnissen werden diese doch in (8x8 Pixel ?) Blöcken gespeichert. Wenn man die Beschneidung nur an diesen Blockgrenzen zuläßt (würde für meine Zwecke reichen) sollte man die Beschneidung doch eigentlich direkt auf den (Datei-) Daten vornehmen können, die Daten also nicht erst in ein "Bild" umwandeln müssen (wies Image::Magick evtl. macht).

Ich hoffe, ihr wisst wie ich das meine und habt ein paar Ideen dazu ;-)

MfG Steffen Flämig

  1. Ich habe das jetzt mit Image::Magick ($image->Crop(geometry=>"800x600+$xOffset+$yOffset");) gemacht.

    Es funktioniert an sich, braucht aber schon auf meinem PC (1,5 GHz) ca. 5 Sekunden, die CPU-Auslastung ist dabei nach Task-Manager 100%.

    Ich benutze die binaries von Imagemagick (vor allem convert), ich habe diese direkt in eine ausführbares Verzeichniss gepackt und starte sie mit system. das läßt Bilder bei meinem Provider bis zu ca. 1500 Pixel zu (allerdings hab ich bis jetzt nur verkleinert)

    GD war wesentlich langsamer und vor allem viel schlechter.

    Kennt jemand eine schneller Methode ein jpg zu beschneiden?

    nein.

    Ich hoffe, ihr wisst wie ich das meine und habt ein paar Ideen dazu ;-)

    Ich weiß was du meinst, hab aber keine Ideen.

    Struppi.

  2. Hallo!

    ich möche aus einer relativ großen (4500 x 3000 Pixel) jpg Datei ein 800 x 600 Pixel Stück an variable Stelle herausschneiden und im Browser anzeigen.

    Ich könnte mir wie struppi vorstellen, dass es evtl. vorteilhaft sein könnte, die Binaries zu verwenden.

    Dann könntest Du das große JPEG einmalig in eine MPC-Datei umwandeln, das Format in welchem ImageMagick Bilder im Speicher vorhält. So entfällt schonmal die Konvertierung des großen JPEGs bei jedem Aufruf. Nach Möglichkeit sollte das Bild im RAM liegen.

    Nach  meinen bescheidenen jpg Kenntnissen werden diese doch in (8x8 Pixel ?) Blöcken gespeichert. Wenn man die Beschneidung nur an diesen Blockgrenzen zuläßt (würde für meine Zwecke reichen) sollte man die Beschneidung doch eigentlich direkt auf den (Datei-) Daten vornehmen können, die Daten also nicht erst in ein "Bild" umwandeln müssen (wies Image::Magick evtl. macht).

    Ich weiß nicht wie JPEG genau funktioniert, würde mich allerdings wundern wenn ImageMagick die Bilder nicht erst in sein eigenes Bildformat konvertiert. Ich kann mir das mit den 8x8 Blöcken allerdings nicht vorstellen, weil es IMHO einer effizienten Komprimierung extrem im Wege stehen würde.

    Je größer die Schritte sind, die Du zwischen den Bildern verwenden kannst, desto eher könntest Du Ausgabe-Bilder cachen. Wenn Du z.B. 20 Pixel-Abstände verwenden kannst, könntest Du das große Bild in entsprechende 20x20 Pixel-Blöcke teilen, und immer nur die benötigten Blöcke laden (z.B. in eine HTML-Tabelle), oder noch besser (aber speicherintensiver) wäre alle möglichen Ausschnitte komplett zu cachen, was natürlich keinen Sinn macht wenn Du den Ausschnitt in extrem kleinen Schritten verschieben können willst.

    Grüße
    Andreas

    --
    SELFHTML Tipps & Tricks: http://aktuell.de.selfhtml.org/tippstricks/
    1. Hallo

      Ich könnte mir wie struppi vorstellen, dass es evtl. vorteilhaft sein könnte, die Binaries zu verwenden.

      Das mache ich schon.

      Dann könntest Du das große JPEG einmalig in eine MPC-Datei umwandeln, ... So entfällt schonmal die Konvertierung des großen JPEGs bei jedem Aufruf.

      Das ist eine gute Idee. Bringt einiges an Performance. Hätte ich auch selbst drauf kommen können ;-( aber zum Glück gibts ja diese Forum. Vielen Dank.

      Ich weiß nicht wie JPEG genau funktioniert, würde mich allerdings wundern wenn ImageMagick die Bilder nicht erst in sein eigenes Bildformat konvertiert. Ich kann mir das mit den 8x8 Blöcken allerdings nicht vorstellen, weil es IMHO einer effizienten Komprimierung extrem im Wege stehen würde.

      Nein, das Kompimierungsverfahren von jpg baut darauf auf.

      MfG Steffen Flämig

  3. Sup!

    Da müsstest Du wohl das Fileformat von JPEG analysieren.
    Es gibt freien Beispielcode für JPEG-Kompression, da müsste man rauslesen können, wie die Blöcke gebastelt werden und was am Rand passiert, wo es nicht hinhaut mit den Blöcken.
    Es wäre natürlich extrem geil, wenn es einen superschnellen JPEG-Resizer gäbe, der das Bild gar nicht erst dekomprimiert.

    Gruesse,

    Bio

    --
    Keep your friends close, but your enemies closer!