Python

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

MAX

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

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

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

スポンサーリンク

メインの処理

1from PIL import Image
2
3def main():
4
5#画像ファイルを開く
6img_tmp = Image.open(img_file_path)
7
8try:
9    #exif情報取得
10    exifinfo = img_tmp._getexif()
11    #exif情報からOrientationの取得
12    orientation = exifinfo.get(0x112, 1)
13    #画像を回転
14    img_tmp_rotate = rotateImage(img_tmp, orientation)
15    #回転した画像を保存(元の画像に上書き)
16    img_tmp_rotate.save(img_file_path)
17except:
18    #exif情報が取得できなかった場合は、そのまま処理を続ける
19    #ホントは拡張子でexifを取得する、しないを判別した方がいいかもしれない。
20    pass

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

画像回転処理

1def rotateImage(img, orientation):
2    """
3    画像ファイルをOrientationの値に応じて回転させる
4    """
5    #orientationの値に応じて画像を回転させる
6    if orientation == 1:
7        pass
8    elif orientation == 2:
9        #左右反転
10        img_rotate = img.transpose(Image.FLIP_LEFT_RIGHT)
11    elif orientation == 3:
12        #180度回転
13        img_rotate = img.transpose(Image.ROTATE_180)
14    elif orientation == 4:
15        #上下反転
16        img_rotate = img.transpose(Image.FLIP_TOP_BOTTOM)
17    elif orientation == 5:
18        #左右反転して90度回転
19        img_rotate = img.transpose(Image.FLIP_LEFT_RIGHT).transpose(Image.ROTATE_90)
20    elif orientation == 6:
21        #270度回転
22        img_rotate = img.transpose(Image.ROTATE_270)
23    elif orientation == 7:
24        #左右反転して270度回転
25        img_rotate = img.transpose(Image.FLIP_LEFT_RIGHT).transpose(Image.ROTATE_270)
26    elif orientation == 8:
27        #90度回転
28        img_rotate = img.transpose(Image.ROTATE_90)
29    else:
30        pass
31
32    return img_rotate

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

 

スポンサーリンク
ABOUT ME
MAX
MAX
ITエンジニア、データサイエンティスト
新卒でSIerに入社し、フリーランスになってWEB系へ転向。
その後AIの世界へ足を踏み入れ、正社員に戻る。 テーブルデータの分析がメイン。
スポンサーリンク
記事URLをコピーしました