Python

【Python】EXIF情報に合わせて画像を回転させる

JPEG(JPG)画像はEXIF情報と言うものを保持しており、その中に画像の回転角度の情報(元の画像を回転させた角度)も保持している。

画像をアップロードしたりするWEBアプリを作成する際に、EXIF情報を意識せずに作成した場合、アップロードした画像が思わぬ方向に回転していたりする。

サーバ側で正しい角度で、画像を一度保存することで、その後の処理では、画像の回転角度を意識することなく処理を行っていくことができる。

メインの処理

from PIL import Image

def main():

#画像ファイルを開く
img_tmp = Image.open(img_file_path)

try:
    #exif情報取得
    exifinfo = img_tmp._getexif()
    #exif情報からOrientationの取得
    orientation = exifinfo.get(0x112, 1)
    #画像を回転
    img_tmp_rotate = rotateImage(img_tmp, orientation)
    #回転した画像を保存(元の画像に上書き)
    img_tmp_rotate.save(img_file_path)
except:
    #exif情報が取得できなかった場合は、そのまま処理を続ける
    #ホントは拡張子でexifを取得する、しないを判別した方がいいかもしれない。
    pass

Imageをimportすれば、そのままexif情報も取得できる。

画像回転処理

def rotateImage(img, orientation):
    """
    画像ファイルをOrientationの値に応じて回転させる
    """
    #orientationの値に応じて画像を回転させる
    if orientation == 1:
        pass
    elif orientation == 2:
        #左右反転
        img_rotate = img.transpose(Image.FLIP_LEFT_RIGHT)
    elif orientation == 3:
        #180度回転
        img_rotate = img.transpose(Image.ROTATE_180)
    elif orientation == 4:
        #上下反転
        img_rotate = img.transpose(Image.FLIP_TOP_BOTTOM)
    elif orientation == 5:
        #左右反転して90度回転
        img_rotate = img.transpose(Image.FLIP_LEFT_RIGHT).transpose(Image.ROTATE_90)
    elif orientation == 6:
        #270度回転
        img_rotate = img.transpose(Image.ROTATE_270)
    elif orientation == 7:
        #左右反転して270度回転
        img_rotate = img.transpose(Image.FLIP_LEFT_RIGHT).transpose(Image.ROTATE_270)
    elif orientation == 8:
        #90度回転
        img_rotate = img.transpose(Image.ROTATE_90)
    else:
        pass

    return img_rotate

Orientationは値によって回転や反転が行われているため、その回転・反転を戻すように回転させる。