« 2008年11月 | メイン | 2009年04月 »

2008年12月12日

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