PillowでJPEGを扱っていると何故かMPOと判定されてしまう画像に遭遇することがある。
>>> from PIL import Image
>>> img = Image.open("bob 15.jpg")
>>> img.format
'MPO'
Pillowのgithub Issuesを検索してみると、どうやらこのIssueで報告されている問題らしい。
再現しないというコメントもあるが、僕の環境(Ubuntu 14.04.3, Python 2.7.6, Pillow 3.0.0)では再現した。
MPOを扱わないなら対処方法は簡単で、_getmp
を無効にしてやればよい。
>>> from PIL import JpegImagePlugin
>>> JpegImagePlugin._getmp = lambda x: None
>>> from PIL import Image
>>> img = Image.open("bob 15.jpg")
>>> img.format
'JPEG'
ちょうどDjango 1.8でdjango.utils.image
が撤廃されてしまったのに困っていたので、
# -*- coding: utf-8 -*-
# myapp/utils/image.py
from PIL import Image, ImageFile # noqa
from PIL import JpegImagePlugin
JpegImagePlugin._getmp = lambda x: None
__all__ = ('Image', 'ImageFile')
のようなモジュールを作り、from django.utils.image import Image
としていたところを、from myapp.utils.image import Image
に一括で変換して、MPO問題とDjango 1.8移行への障害の一つを同時に片付けることが出来た。
そもそもMPOとはなんぞや?という点については、Wikipedia英語版によると、"Multi-Picture Format"の略でJPEGを拡張して3D画像を扱えるようにした画像フォーマットということらしい。
Nintendo 3DSで3D写真を撮ると.mpo形式になるようなので、サービスの性質によってはMPOを正しく扱う必要があるのかも。