Schrift
[thread]6422[/thread]

GD-Problem: Fehler



<< |< 1 2 3 >| >> 28 Einträge, 3 Seiten
Froschpopo
 2004-07-21 21:02
#84718 #84718
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
ich habe ein programm, welches ca. 14.000 Bilder verkleinert.
Ich durchlaufe die Bilder in einer Schleife. Irgendwann bleibt diese jedoch mit einer Fehlermeldung von GD stehen:
Code: (dl )
1
2
3
Corrupt JPEG data: 2385 extraneous bytes before marker 0x51
gd-jpeg: JPEG library reports unrecoverable error: Unsupported marker type 0x51
source is not of type GD::Image at thumbs.pl line 29.

ich habe geschaut, auf welches Bild sich der Fehler bezieht. Laut der Liste der Dateien auf das Bild 207464.jpg, da der Fehler dort auftritt. Also habe ich es entfernt. aber der Fehler tritt trotzdem wieder genau dort auf.
Nun möchte ich gerne diese Fehlermeldung abschalten, sprich: Ich will dass der Fehler einfach von GD ignoriert wird.. ich werde ja dann später sehen, welches Bild er nicht verkleinert hat.
mein Programm zur Bildverkleinerung sieht so aus:
Code: (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
#!/usr/bin/perl

use strict;
use GD;
use Image::Size;

my ($width,$height);
my ($thumbnailwidth, $thumbnailheight);
my $max_height;
my $max_width;
my $relation;
my $big;
my $lit;

chdir("/usr/local/httpd/htdocs/thumbs/") || die $!;
for(glob("*.jpg"))
{
print "$_\n";
($width,$height) = imgsize($_);
($thumbnailwidth, $thumbnailheight) = ($width, $height);

$max_height = 80;
$max_width = 80;
$relation = ($height / $max_height) > ($width / $max_width) ? $height / $max_height : $width / $max_width;
$thumbnailheight = sprintf ("%.0f",$height / $relation);
$thumbnailwidth = sprintf ("%.0f",$width / $relation);
$big = GD::Image->newFromJpeg("/usr/local/httpd/htdocs/thumbs/$_");
$lit = new GD::Image($thumbnailwidth,$thumbnailheight);
$lit->copyResized($big, 0, 0, 0, 0, $thumbnailwidth, $thumbnailheight, $width, $height);
my $jpeg_data = $lit->jpeg;
open (OUTFILE,">/usr/local/httpd/htdocs/thumbs/$_");
print OUTFILE $jpeg_data;
close OUTFILE;

}

es ist wirklich sehr eilig, denn die User sehen eine Fehlermeldung (ca. 21.000 User) solang das Problem nicht behoben ist!
ptk
 2004-07-21 21:22
#84719 #84719
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Pack' den Code in ein eval { ... }. Ob es einen Fehler gab, kannst du in der Variable $@ sehen. Also:
Code: (dl )
1
2
3
4
5
6
7
8
for(glob("*.jpg"))
{
eval {
print "$_\n";
...
};
warn $@ if $@;
}
Froschpopo
 2004-07-21 21:22
#84720 #84720
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
wird gleich geändert - muss erst den code ausprobieren\n\n

<!--EDIT|Froschpopo|1090430646-->
Froschpopo
 2004-07-21 21:26
#84721 #84721
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
klasse, danke ! weißt du zufällig, ob man d anoch irgendwie den dateiname des bildes herausfinden könnte? kjannst dich am folgenden code orientieren:
Code: (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
#!/usr/bin/perl

use strict;
use GD;
use Image::Size;

my ($width,$height);
my ($thumbnailwidth, $thumbnailheight);
my $max_height;
my $max_width;
my $relation;
my $big;
my $lit;

chdir("/usr/local/httpd/htdocs/thumbs/") || die $!;
for(glob("*.jpg"))
{
eval {
print "$_\n";
($width,$height) = imgsize($_);
($thumbnailwidth, $thumbnailheight) = ($width, $height);

$max_height = 80;
$max_width = 80;
$relation = ($height / $max_height) > ($width / $max_width) ? $height / $max_height : $width / $max_width;
$thumbnailheight = sprintf ("%.0f",$height / $relation);
$thumbnailwidth = sprintf ("%.0f",$width / $relation);
$big = GD::Image->newFromJpeg("/usr/local/httpd/htdocs/thumbs/$_");
$lit = new GD::Image($thumbnailwidth,$thumbnailheight);
$lit->copyResized($big, 0, 0, 0, 0, $thumbnailwidth, $thumbnailheight, $width, $height);
my $jpeg_data = $lit->jpeg;
open (OUTFILE,">/usr/local/httpd/htdocs/thumbs/$_");
print OUTFILE $jpeg_data;
close OUTFILE;
}

}
ptk
 2004-07-21 21:31
#84722 #84722
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Du kannst am Ende des evals die Fehlermeldung mit dem Bild ausgeben lassen. Z.B.:
Code: (dl )
1
2
3
4
5
6
eval {
...
};
if ($@) {
warn "Die Datei $_ war fehlerhaft. Mehr Information: $@";
}
Froschpopo
 2004-07-21 21:32
#84723 #84723
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
ich liebe dich!!!!!!!!!! vielen dank, bei gelegenheit lad ich dich aufn bier ein!:D
Froschpopo
 2004-07-21 21:53
#84724 #84724
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
ist ja echt merkwürdig, das bild beginnt normal mit FF D8 und wird in allen Grafikprogramen einwandfrei angezeigt. aber von GD wird es irgendwie nicht anerkannt, ist das vielleicht ein Bug im GD?
ptk
 2004-07-21 22:12
#84725 #84725
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Ein Bug ist nicht auszuschliessen; ich habe schon ein paar Mal Bugs in GD gefunden. Allerdings verwendet gd wie fast alle Unix/Linux-Programme zum Einlesen von JPEG-Bildern libjpeg (es sieht so aus, als ob du Unix/Linux verwendest).
esskar
 2004-07-22 06:33
#84726 #84726
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
hmmm...
mit chdir("/usr/local/httpd/htdocs/thumbs/") || die $!; wechselst du ja in den Ornder, in dem deine Thumbnails liegen;
dann ziehst du dir mit glob alle jpges in den Kopf und wandelst sie um; wandelst du dann nicht auch alle schon umgewandelten jpgs um?`

und wenn du eh chdir benutzt (btw. finde das nicht so toll; lieber readdir benutzen), brauchst du denn pfad ("/usr/local/httpd/htdocs/thumbs/ vor $_ nicht
esskar
 2004-07-22 07:10
#84727 #84727
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
hier mal meine interpretation des codes

Code: (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
#!/usr/bin/perl

use strict;
use GD;
use Image::Size;
use IO::File;
use IO::Dir;

use constant MAX_WIDTH => 80;
use constant MAX_HEIGHT => 80;
use constant IMAGEPATH => "/usr/local/httpd/htdocs/thumbs/";

resize_images(IMAGEPATH, ".jpg", MAX_WIDTH, MAX_HEIGHT);

sub resize_images
{
  my ($folder, $ext, $maxwidth, $maxheight) = @_;

  my $dir = new IO::Dir;
  if($dir->open($folder))
  {
     while(defined(my $filename = $dir->read))
     {
        my $file = "$folder/$filename";
        next if $file =~ /^\.\.?$/;
        next if -d $file;
        next if $file !~ /$ext$/io;
       
        eval
        {
           my ($width, $height) = imgsize($file);
           my $relation = ($height / $max_height) > ($width / $max_width) ? $height / $maxheight : $width / $maxwidth;
           my $thumbnailheight = sprintf ("%.0f",$height / $relation);
           my $thumbnailwidth = sprintf ("%.0f",$width / $relation);
     
           my $big = GD::Image->newFromJpeg($file);
           my $lit = new GD::Image($thumbnailwidth, $thumbnailheight);
           $lit->copyResized($big, 0, 0, 0, 0, $thumbnailwidth, $thumbnailheight, $width, $height);

           my $fh = new IO::File;
           if($fh->open("> $file))
           {
              print $fh $lit->jpeg;
              $fh->close();
           }
           undef $lit;
           undef $big;
        }
     }
     $dir->close();
  }  
}
\n\n

<!--EDIT|esskar|1090480259-->
<< |< 1 2 3 >| >> 28 Einträge, 3 Seiten



View all threads created 2004-07-21 21:02.