解决PIL读取图片出现自动旋转的解决方案

最近项目中,使用手机采集了数据,交给标注组进行标注时,发现返回来的标注文件与图片存在不匹配问题,部分标注存在旋转情况。从网上了解到电子设备在拍摄照片时,如手机、相机等,由于手持朝向的不同,拍摄的照片可能会出现旋转 0、90、180、270 角度的情况,其 EXIF 信息中会保留相应的方位信息.有些情况下,电脑上打开显示照片是正常的,但在用 PIL 或 OpenCV 读取图片后,图片出现旋转,且读取的图片尺寸也可能与直接在电脑上打开的尺寸不同的问题.

对此,需要在读取图片时,同时解析图片的 EXIF 中的方位信息,将图片转正,再进行后续的其他操作.实例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from PIL import Image, ExifTags
def IsRotate(img): # 返回false表示存在旋转情况
try:
for orientation in ExifTags.TAGS.keys() :
if ExifTags.TAGS[orientation]=='Orientation' :
img2 = img.rotate(0, expand = True)
break
exif=dict(img._getexif().items())
if exif[orientation] == 3 :
img2=img.rotate(180, expand = True)
elif exif[orientation] == 6 :
img2=img.rotate(270, expand = True)
elif exif[orientation] == 8 :
img2=img.rotate(90, expand = True)

return img.size == img2.size
except:
return True

更多可参考:Stackoverflow - PIL thumbnail is rotating my image?