読者です 読者をやめる 読者になる 読者になる

PILでデコードできないJPEG

Python

PILで画像を保存しようとすると、"IOError: image file is truncated (22 bytes not processed)"というようなエラーが出て困っています。
例えば、以下のURLに掲載されている画像で現象が100%再現します。


http://photozou.jp/photo/photo_only/2/6026745


このページからオリジナル画像を取得し、PILでデコード・保存しようすると、次のようにエラーとなります。

>>> from PIL import Image
>>> img = Image.open(file('6026745.jpg', 'rb'))
>>> img.save('test.jpg')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
# 略
IOError: image file is truncated (22 bytes not processed)


Googleで検索してみたところ、"Image-SIG"で同じような質問が出ていて、「img.show()を呼んでからならば、保存できた」ということが書いてありました。
さすがに、今作っているアプリケーションではimg.show()を呼ぶことはできないので、いろいろ試してみたところ、save()を呼んで、この"image file is truncated"なIOErrorが発生した場合でも、もう一度save()を呼ぶと正常に動くことに気がつきました。

>>> from PIL import Image
>>> img = Image.open(file('6026745.jpg', 'rb'))
>>> img.save('test.jpg')
# さっきと同じエラーになる
>>> img.save('test.jpg')
# 今度は正常に保存できる


非常に消極的で、気持ちが悪い対処法なのですが、とりあえずこの路線で問題に対処することにしました。PIL.ImageFileの単純なバグだとは思うのですが、深追いしている余裕が今はない・・・