Image::Sizeで読めないjpegファイルへ対応するpatch
このページにあるようなjpegファイルがImage::Size(3.1.1)でうまく認識ができないので対応patch書きました。
WX310SA(など)で映した写真の場合、jpegのヘッダ中でmarkerであるffが並ぶところがあるようで、Image::Sizeでそれを扱えません。ただ、普通の場合、Image::SizeがImage::Magickを呼ぶので気付きにくいかもしれません。サービスで使う時に、Image::Magickを呼ばれたくないので無理矢理切っていたため気付いた次第です。
↓patch
--- lib/Image/Size.pm.orig 2008-12-12 18:13:39.000000000 +0900 +++ lib/Image/Size.pm 2008-12-12 18:18:53.000000000 +0900 @@ -932,12 +932,19 @@ &$read_in($stream, 2); while (1) { - $length = 4; + $length = 2; $segheader = &$read_in($stream, $length); # Extract the segment header. - ($marker, $code, $length) = unpack("a a n", $segheader); + ($marker, $code) = unpack("a a", $segheader); + while ( $code eq $MARKER && ($marker = $code) ) { + $segheader = &$read_in($stream, 1); + ($code) = unpack("a", $segheader); + } + my $length_header = &$read_in($stream, 2); + $length = unpack( "n", $length_header); + # Verify that it's a valid segment. if ($marker ne $MARKER) {
確認
patch前
$ perl -MImage::Size -le 'print join ",", Image::Size::imgsize($ARGV[0])' SA410081.jpg 960,1280,Joint Photographic Experts Group JFIF format
Image::Magickが呼ばれて、なんか長いフォーマットが表示されます
patch後
$ perl -Iblib/arch/auto -Iblib/lib -MImage::Size -le 'print join ",", Image::Size::imgsize($ARGV[0])' SA410081.jpg 960,1280,JPG
正しく"JPG"と判定できました
ExifToolだとProcessJPEGの中で対応していますね
# JPEG markers can be padded with unlimited 0xff's for (;;) { $raf->Read($ch, 1) or last Marker; $nextMarker = ord($ch); last unless $nextMarker == 0xff; }
patchを送った方がいいかなぁ