Leser: 21
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
#!/usr/bin/perl use strict; use warnings; my $file='data.dat'; my $img_file='/tests/image%05u.jpg'; my $chunksize=1024; #byte open(my $fh, '<', $file) or die("ERROS open $file, ($!)\n"); binmode($fh); my $chunk=''; my $data=''; my $img=''; my $img_count=0; while(read($fh,$chunk,$chunksize)) { # wenn gerade kein Bild gelesen wird, # dann nach einem Bildanfang suchen if(!$img) { # den letzten gelesen chunk mit dem neuen Kombinieren, # damit man Überschneidungen erkennt. $data.=$chunk; # jpeg Anfang $img=$1 if($chunk=~/(\xFF\xD8.+)$/s); $data=$chunk; $chunk=''; } # es wurde ein Bildanfang gefunden # ("\xFF\xD8") ist auf jeden Fall "wahr", # und das muss im String stehen if($img) { # den aktuellen chunk hinzu # darum habe ich $chunk oben gelehrt. # wenn ein Bild vollständig in einem chunk ist, # würde es Sonst zu Problemen kommen $img.=$chunk; # jpeg ende if($img=~/^(.+?\xFF\xD9)/s) { # Restdaten, # die noch ein Bildanfang enthalten können $data=$'; # heraus geschnittene Bilddaten $img=$1; # Bildnamen erzeugen und speichern my $img_name=sprintf($img_file,$img_count); $img_count++; if(open(my $ifh, '>', $img_name)) { binmode($ifh); print $ifh $img; close($ifh); } else { warn ("ERROR open $img_name ($!)\n"); } # Bildstring leeren, damit die Suche wieder beginnt $img=''; } } } close($fh);
2010-11-23T07:54:47 attaxtopeg, danke für die schnelle antwort. Vorab: Du bist echt unglaublich!!