Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]11468[/thread]

Bild speicherschonend verkleinern

Leser: 1


<< |< 1 2 >| >> 15 Einträge, 2 Seiten
roooot
 2008-03-14 22:30
#107076 #107076
User since
2008-03-03
276 Artikel
BenutzerIn
[default_avatar]
Hallo

ich habe ein Problem: Ich verkleinerne online ein Bild. Allerdings schlägt das oftmals fehl, falls das Bild zu groß ist. Es kommt dann
Code: (dl )
gd-jpeg: JPEG library reports unrecoverable error: Insufficient memory (case 4)
.
Ich verwende dabei CPAN:image::resize. Das sieht dann so aus:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
use Image::Resize;
my $image = Image::Resize->new('./.tmp/bilder_'.$grid.'/'.$hash.'.jpg') or share::logge('BILDUPLOAD: kann bild nicht lesen: '.$!);
my $conv        = $image->resize(1100, 1100) or share::logge('BILDUPLOAD: kann conv nicht erstellen: '.$!);
my $thumb       = $image->resize(120, 120) or share::logge('BILDUPLOAD: kann thumb nicht erstellen: '.$!);
          
open(FH, '> ./.tmp/bilder_'.$grid.'/conv_'.$hash.'.jpg') or share::logge('BILDUPLOAD: kann bild nicht schreiben: '.$!);
print FH $conv->jpeg();
close(FH);
                  
open(FH, '> ./.tmp/bilder_'.$grid.'/th_'.$hash.'.jpg') or share::logge('BILDUPLOAD: kann thumb nicht schreiben: '.$!);
print FH $thumb->jpeg();
close(FH);  

Wie kann ich das schonender umwandeln? Geht das überhaupt. Über die Hardware habe ich leider keine Auskunft, da ich ein shared Hosting Paket habe. Dort ist auch ImageMagick nicht vorinstalliert.

Danke für Tipps!
Viele Grüße :)
ptk
 2008-03-15 01:04
#107079 #107079
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
ImageMagick ist typischerweise noch speicherhungriger. Schlägt schon das Einlesen mit GD fehl? Könntest du vielleicht mit Imager arbeiten?
roooot
 2008-03-15 01:30
#107081 #107081
User since
2008-03-03
276 Artikel
BenutzerIn
[default_avatar]
Ja das einlesen mit GD schlägt mit folgender Meldung ($!) fehl:
Cannot allocate memory

Imager ist nicht vorinstalliert, wenn man das selbst compilieren muss usw dann wird das auch nichts.
Muss ich wohl oder übel auf ein performanteres Webpacket umsatteln?!!
Viele Grüße :)
ptk
 2008-03-15 01:58
#107083 #107083
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Vielleicht hast du ja Glück und cjpeg und djpeg sind auf deinem System installiert. Damit könnte man auch skalieren, vielleicht auch deutlich speichersparender:
Code: (dl )
djpeg -scale 1/8 < foo.jpg |cjpeg > foosmall.jpg
GwenDragon
 2008-03-15 12:29
#107084 #107084
User since
2005-01-17
14606 Artikel
Admin1
[Homepage]
user image
Letzteres wäre nützlich, aber das hängt davon ab, ob überhaupt das ganze per Shell aufrufbar ist.

Aber das ändert eher nichts daran, dass Speicher für das einzulesende Bild vorhanden sein muss. Daran scheitert es doch wohl.

Wie groß ist denn das Ausgangsbild?
ptk
 2008-03-15 12:59
#107087 #107087
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Nein, cjpeg scheint recht effizient vorzugehen. Für das Verkleinern braucht man ja nicht das gesamte Bild, sondern kann Zeile für Zeile operieren. Ich habe mal den maximalen Speicherverbrauch von djpeg|cjpeg und convert verglichen (jeweils ein 2000x3000 JPG eingelesen und wieder ausgegeben): bei cjpeg+djpeg sind es 78912+108320, bei ImageMagick (convert) 20838124 Bytes.
GwenDragon
 2008-03-15 13:01
#107088 #107088
User since
2005-01-17
14606 Artikel
Admin1
[Homepage]
user image
Danke, bin wieder schlauer geworden (ich habe auf meinem Linux kein c/djepeg).
ptk
 2008-03-15 13:08
#107089 #107089
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Normalerweise bekommt man das mit libjpeg zusammen mit. Aber manche Linux-Distributionen schnipseln gerne alle Pakete auseinander...
roooot
 2008-03-15 13:28
#107090 #107090
User since
2008-03-03
276 Artikel
BenutzerIn
[default_avatar]
Danke für den Speichervergleich, sehr beeindruckender Unterschied.

Wie kann ich nachschauen ob die Programme verfügbar sind?
Code (perl): (dl )
system 'djpeg' or die;



Allerdings kann djpeg nur das Bild insgesamt verkleinern? Also 1:2 1:4 oder 1:8 aber nicht auf eine bestimmte Größe?
Viele Grüße :)
GwenDragon
 2008-03-15 16:26
#107091 #107091
User since
2005-01-17
14606 Artikel
Admin1
[Homepage]
user image
Könnte auch mit `which djpeg`
bzw. `whereis djpeg`
gehen.
<< |< 1 2 >| >> 15 Einträge, 2 Seiten



View all threads created 2008-03-14 22:30.