Python PILで読み取った画像が自動回転する実現方法


携帯電話やカメラなどの機器で撮影された写真は、手に持つ方向によっては0°、90°、180°、270°回転することがあります。コンピュータ上でソフトウェアを利用して正の位置に変えても、彼らのexif情報の中には方位情報が残っています。
これらの画像をPILで読み取った場合、元のデータを読み取っています。つまり、パソコンの画面に正常な写真が表示されていても、PILで読み取っても、回転する画像かもしれません。また、画像のsizeは画面とは違っているかもしれません。
この場合、PILを利用してexifのorentation情報を読み取り、この情報に基づいて画像を正にしてから、後続の動作を行うことができます。具体的には以下の通りです。

from PIL import Image, ExifTags
img = Image.open(file)
try:
  for orientation in ExifTags.TAGS.keys() : 
    if ExifTags.TAGS[orientation]=='Orientation' : break 
  exif=dict(img._getexif().items())
  if  exif[orientation] == 3 : 
    img=img.rotate(180, expand = True)
  elif exif[orientation] == 6 : 
    img=img.rotate(270, expand = True)
  elif exif[orientation] == 8 : 
    img=img.rotate(90, expand = True)
except:
  pass
ちなみに、ここではrotateの「expand=True」は画像サイズも対応して変換されます。この文を加えないとsizeは変わりません。
詳細は参照してください。https://stackoverflow.com/questions/4228530/pil-thumbnail-is-rotating-my-image
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。