Schrift
[thread]12781[/thread]

Was will mir dieser Fehler sagen? gd-jpeg: cannot allocate gdImage struct

Leser: 1


<< |< 1 2 >| >> 17 Einträge, 2 Seiten
roooot
 2008-11-19 15:48
#116399 #116399
User since
2008-03-03
276 Artikel
BenutzerIn
[default_avatar]
Hi,

ich verkleinere Bilder mittels CPAN:Image::Resize. Das funktioniert in einem kleinen Testscript
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/usr/bin/perl -w
use strict;
use Carp;


### extend @INC

use lib ( 
    './',
);
use CGI qw(:standard);


use Image::Resize;

for(1..10) {    
    my $image = Image::Resize->new(qq{in$_.jpg});
    
    my $gd = $image->resize(800, 800);
    
    open(FH, qq{>out$_.jpg});
    print FH $gd->jpeg();
    close(FH);
    
    
    my $gd = $image->resize(50, 40, 0);
    
    open(FH, qq{>thumb$_.jpg});
    print FH $gd->jpeg();
    close(FH);
}

print CGI::header();
print "resize: finish";

wunderbar.

Bei meinem Hauptscript (siehe unten) kommt hingegen bei den gleichen Bildern dieser Fehler
Code: (dl )
1
2
[Wed Nov 19 14:44:12 2008] [error] [client **********] gd-jpeg error: cannot allocate gdImage struct
[Wed Nov 19 14:44:12 2008] [error] [client **********] Died at module/CPAN/Image/Resize.pm line 25.


Andere Bilder mit anderen Abmessungen funktionieren aber 1a im Hauptscript. Allerdings kann es ja kein memory Fehler sein, weil da hatte ich immer eine insufficent memory o.s.ä Fehler, nicht aber diesen.


Danke für eure Hilfe





Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
sub save {
    
    my ($self) = @_;
    
    ### get file
    my $file = $file_of{ident $self};
    
  
#####################################################
#   currently quit because of error:                #  
#       Undefined subroutine Fh::seek               #
#           at module/CPAN/File/MMagic.pm line 802  #
#####################################################     
    ### check if file is jpeg
#    require File::MMagic;
#    require FileHandle;
#    my $mm = new File::MMagic;
#    my $file_mimetype = $mm->checktype_filehandle($file);
#    
#        print CGI::header();
#        print qq{mimetype $file_mimetype};
#        exit;
    
    
    
    ### get file hash - method sha1
    require Digest::SHA1;
    my $sha1 = Digest::SHA1->new;
    $sha1->add($file);
    my $file_hash = $sha1->hexdigest;
    
    
    ### get gallery securestring    
    require Gallery::Gallery;
    my $gal_securestring = new Gallery::Gallery({
            'Gallery' => {
                parameters => $self->get_params(),
                session    => $self->get_session(),
                domain     => $self->get_domain(),
                         },
            'Gallery::Gallery' => {
                id         => $self->get_id(),
        },
    })->get_securestring($self->get_id());
    
    
    ### check if gid exists
    if($gal_securestring eq 'notfound') {
        print CGI::header();
        print qq{Cant save: gal_securestring for $self->get_id() not found};
        exit;
    }
    
    
    ### save orig picture
    open my $ORIG, qq{>./pictures/$gal_securestring/org-$file_hash.jpg}
        or carp qq{Cant save orig: $!};
    binmode $ORIG;
    binmode $file;
    my $data;
    while(read $file,$data,1024) {
        print $ORIG $data;
    }
    close $ORIG;
    
    
    ### resize picture   
    use Image::Resize;        
    my $image =
        Image::Resize->new(qq{./pictures/$gal_securestring/org-
        $file_hash.jpg});

    
    
    ### picture for default view
    my $gd = $image->resize(800, 800);
        
    open my $PIC, qq{>./pictures/$gal_securestring/$file_hash.jpg} 
        or carp qq{Cant save: $!};
    print $PIC $gd->jpeg();
    close $PIC;
    
    
    ### thumb
    $gd = $image->resize(50, 40, 0);
    
    open my $THUMB, qq{>./pictures/$gal_securestring/th-$file_hash.jpg}
        or carp qq{Cant save thumb: $!};
    print $THUMB $gd->jpeg();
    close $THUMB;
    
    
    ### get picture ratio
    require GD::Simple;
    $image    =
        GD::Simple-
        >newFromJpeg(qq{./pictures/$gal_securestring/$file_hash.jpg},1) 
            or print qq{Cant read image for ratio: $!};
    my $file_width  = $image->width();
    my $file_height = $image->height();
    my $file_ratio  = sprintf("%.2f", $file_width / $file_height);
    
    ### get exif data
    require Image::ExifTool;
    my $exif_tool   = new Image::ExifTool;
    my $exif_info   = 
        $exif_tool->ImageInfo(qq{./pictures/$gal_securestring/org-$file_hash.jpg})
            or print qq{Cant read exifdata: $!};    

    ### data saved in: $$info{'DateTimeOriginal'}
    
    
    ### clean name:
    use HTML::Entities;
    my $file_name = encode_entities($file);
    
    
    ### insert in mysql db
    require MySQL;
    new MySQL->insert({
        values  => {
            gid     => $self->get_id(),
            uid     => $self->get_session()->param('u_id'),
            name    => $file_name,
            hash    => $file_hash,
            ratio   => $file_ratio,
            exif    => $$exif_info{'DateTimeOriginal'},
            created => 'NOW()',
            clicks  => 0
        },
        table   => 'pictures'        
    });
    
    
    ### send success
    my $json_to_parse = {
        result  => 'success'
    };
    
    require JSON;
    my $output_as_json =
    new JSON->pretty->encode($json_to_parse);
    
    require Parser;
    new Parser({
        data        => $output_as_json,
        outputtype  => 'js',
    })->output();
                    
    
}
Viele Grüße :)
roooot
 2008-11-19 16:21
#116402 #116402
User since
2008-03-03
276 Artikel
BenutzerIn
[default_avatar]
Ok, ich habe mal im libgd irc channel nachgefragt und dort wurde mir gesagt, dass gdImageCreateTrueColor inside gdImageCreateFromJpegCtx fehl schlägt, was wohl auf zu wenig Arbeitsspeicher zurückzuführen ist.

Das merkwürdige ist halt, dass es mit exakt den gleichen Bildern in dem Testscript durchläuft.
Viele Grüße :)
GwenDragon
 2008-11-19 16:50
#116404 #116404
User since
2005-01-17
14749 Artikel
Admin1
[Homepage]
user image
Wenn du use warnings verwendest, würdest du ein paar Fehler in deinem Skript bemerken.

Und warum prüfst du nicht, ob das Erstellen des Images geklappt hat. Stichwort Rückgabewert bei $gd bzw. $image prüfen.
Zudem sperrst du nicht die Dateien per lock bei der Ausgabe.

Wieso verwendest du require bei den packages? kein use? Welcher Grund?

Oder hast du das Testskript nur kurz hingeschrieben und programmierst in Wirklichkeit konsequenter und sicherer?
roooot
 2008-11-19 17:18
#116406 #116406
User since
2008-03-03
276 Artikel
BenutzerIn
[default_avatar]
Oben ist das Testscript, das in der Tat nur schnell hingefetzt ist.

Unten ist ein Teil des Uploadmoduls, das ich verwende. Ich benutzt dort require weil ich hier gelernt habe, dass require die Module nur läd, wenn sie auch gebraucht werden im Gegensatz von use, dass die Module beim "Kompilieren" immer läd.


Das Erstellen klappt ja nicht, würde ich ja im FTP Ordner sehen ;)



Ich versuche nun, den resize Prozess auszulagern. Dazu wollte ich per system ein Script aufrufen, dass verkleinert, da ich die Vermutung habe, dass mein Webhoster eine maximal Speichergröße/Prozess eingestellt hat.
Ich rufe das Script per
Code (perl): (dl )
my $resize_sucess =system("./resize.cgi ss=$gal_securestring fh=$file_hash");

Im Internet [1] habe ich gefunden, dass CGI auch bei Kommandozeilen aufrufen die Parameter empfangen kann:
Code (perl): (dl )
1
2
3
4
5
6
use CGI;

my $cgi = new CGI;

my $gal_securestring = $cgi->param('ss');
my $file_hash            = $cgi->param('fh');

Klappt aber nicht, ist immer leer



[1] http://forum.de.selfhtml.org/archiv/2002/9/t22525/
Viele Grüße :)
Struppi
 2008-11-19 17:30
#116407 #116407
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Ich hab jetzt nicht alles durchgelesen, hatte aber auch Probleme dass ich manche Bilder nicht verkleinern konnte. Vor allem das GD Modul ist sehr speicherintensiv. Ich bin dann auf die (Linux) Binaries von imagemagick umgestiegen und rufe diese per system auf. Was aber ab einer bestimmten Größe auch nicht klappt.
roooot
 2008-11-19 17:34
#116408 #116408
User since
2008-03-03
276 Artikel
BenutzerIn
[default_avatar]
Ja ImageMagick ist nicht verfügbar. Das hat mein Hoster vermutlich extra so gemacht, damit er auch seine 4 mal teureren Pakete - die explizit zur Bildbearbeitung umworben werden - verkaufen kann ;) Kann man ja nachvollziehen


Wie muss man denn Rechnen? Wenn ich die 2MB JPEG Datei im Photoshop öffne zeigt der mir als Größe 18 MB ungepackt an. Das Limit liegt laut Anbieter bei 32MB, eigentlich noch genug Luft?!
Viele Grüße :)
Struppi
 2008-11-19 17:52
#116409 #116409
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
wie gesagt beim GD Modul bin ich viel früher als bei 2MB grossen Bildern schon an die Grenze gestossen, trotz XXL Paket.

Wie gesagt probier doch mal die ImageMagick Binaries selbst in ein Verzeichnis zu speichern und dann aufrufen, bei mir geht das (Hosteurope).
GwenDragon
 2008-11-19 17:53
#116410 #116410
User since
2005-01-17
14749 Artikel
Admin1
[Homepage]
user image
Was sagt denn die shell wieviel Speicher frei ist?
Einfach mal in der Shell free eingeben.
roooot
 2008-11-19 18:17
#116412 #116412
User since
2008-03-03
276 Artikel
BenutzerIn
[default_avatar]
Struppi ich bin auch bei Hosteurope und habe ein WebPack L 2.0.
Wie genau hast du das gemacht? Kannst du mir mal eine PN schreiben wie genau ich vorgehen muss?
Ich habe nun den resize Prozess in ein eigenes Script ausgelagert und rufe es per system auf. Nun kann ich die gleichen Fotos verarbeiten.


Allerdings klappt das mit dem übergeben der Variablen nicht.



Wie funktioniert das mit der Shell?
Viele Grüße :)
Struppi
 2008-11-19 18:40
#116413 #116413
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Guck mal hier.

Du kannst dann convert mit system aufrufen, du brauchst allerdings dann immer die absoluten Pfade zu den Bildern.

Z.b. so:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
my $magick = '/is/htdocs/*deine_kd_kennung*/lib/imagemagick/convert';
die "Imagemagick existiert nicht" unless(-e $magick );


#--------------------------------------------------------------------
sub resize # ( Bild, neues Bild, Ratio)
#--------------------------------------------------------------------
{
    my ($src_file,  $dst_file, $aspect) =@_;
    return "$src_file existiert nicht" unless -e $src_file;
    open F, ">$dst_file" or die "Kann Datei nicht erstellen $dst_file: $!";
    close F;
    $aspect = int($aspect * 100) . '%';

    my $system = sprintf " $magick -quality 50%% -geometry %s! \"%s\" \"%s\"",
                  $aspect, $src_file, $dst_file
    ;
    return system $system;
}

ungetestet, da aus einem Modul rauskopiert. Und relativ alt, geht evtl. besser.
<< |< 1 2 >| >> 17 Einträge, 2 Seiten



View all threads created 2008-11-19 15:48.