use strict; my $debug=0; sub readUInt8 { my ($fh) = @_; my $data; read($fh, $data, 1); return unpack("C", $data); } sub readUInt16 { my ($fh) = @_; my $data; read($fh, $data, 2); return unpack("n16", $data); } sub skipBytes { my ($fh, $len) = @_; my $data; printf(" Skipping %d bytes\n", $len) if ($debug); read($fh, $data, $len); } sub skipSection { my ($fh, $v) = @_; my $len = readUInt16($fh); skipBytes($fh, $len-2); } sub getImageInfo { my ($filename) = @_; my $v; my $fh; my $width=0; my $height=0; my $type=""; open($fh, $filename); binmode($fh); $v = readUInt16($fh); if ($v == 0xffd8) { my $done=0; while (!$done) { $v = readUInt16($fh); printf("Section %x\n", $v) if ($debug); if ($v == 0xffe0 || $v == 0xffdb || $v == 0xffe0 || $v == 0xffe1 || $v == 0xffe2 || $v == 0xffe3 || $v == 0xffe4 || $v == 0xffe5 || $v == 0xffe6 || $v == 0xffe7 || $v == 0xffe8 || $v == 0xffe9 || $v == 0xffea || $v == 0xffeb || $v == 0xffec || $v == 0xffed || $v == 0xffee || $v == 0xffc4 || $v == 0xffe0 || $v == 0xfffe ) { skipSection($fh, $v); } elsif ($v == 0xffdd) { skipBytes($fh, 4); } elsif ($v == 0xffc0) { $v = readUInt16($fh); # len $v = readUInt8($fh); # precision $height = readUInt16($fh); # width $width = readUInt16($fh); # height $type = "jpg"; last; } else { printf("$filename - Unexpected value %x\n", $v); last; } } } close($fh); return ($type, $width, $height); }