PIL(Pillow) で JPEG ファイルをオープンしたとき、EXIF の Orientation タグに値が設定されていても特に考慮されない。
Orientation タグに設定されている値に従った回転・フリップ処理を行った後のデータを生成する方法の実装例。
from PIL import Image
file_path = "JPEG 画像ファイルのパス"
# Orientation タグ値にしたがった処理
# PIL における Rotate の角度は反時計回りが正
convert_image = {
1: lambda img: img,
2: lambda img: img.transpose(Image.FLIP_LEFT_RIGHT), # 左右反転
3: lambda img: img.transpose(Image.ROTATE_180), # 180度回転
4: lambda img: img.transpose(Image.FLIP_TOP_BOTTOM), # 上下反転
5: lambda img: img.transpose(Image.FLIP_LEFT_RIGHT).transpose(Pillow.ROTATE_90), # 左右反転&反時計回りに90度回転
6: lambda img: img.transpose(Image.ROTATE_270), # 反時計回りに270度回転
7: lambda img: img.transpose(Image.FLIP_LEFT_RIGHT).transpose(Pillow.ROTATE_270), # 左右反転&反時計回りに270度回転
8: lambda img: img.transpose(Image.ROTATE_90), # 反時計回りに90度回転
}
img = Image.open(file_path)
exif = img._getexif()
orientation = exif.get(0x112, 1)
new_img = convert_image[orientation](img)
EXIF 規格の定義はこちら。
http://www.cipa.jp/std/documents/j/DC-008-2012_J.pdf
ただ EXIF の Orientation タグの値の定義は、その説明だけ見てもパッと分かりづらい。検索すれば分かりやすく解説してくれているページがいろいろある。例えばこちらなど。
http://hackmylife.net/archives/7400448.html