LoginSignup
0
3

More than 5 years have passed since last update.

PillowでJPEGがMPOと判定されてしまう問題の回避策

Posted at

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を正しく扱う必要があるのかも。

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3