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を送った方がいいかなぁ