在Python中调整图像大小和旋转后保留EXIF信息并保存

12 浏览
0 Comments

在Python中调整图像大小和旋转后保留EXIF信息并保存

我在SO上阅读了关于图像旋转的另一个帖子:

PIL缩略图是否会旋转我的图像?

还阅读了SO上关于保留EXIF数据的另一个帖子:

当调整大小(创建缩略图)时,用PIL保留图像的EXIF数据

不幸的是,实施上述建议后,似乎我只能选择:

1)保存旋转了但没有EXIF数据的图像

或者

2)带有EXIF数据但没有旋转的图像

似乎无法同时实现两者。

我希望能够得到一些帮助,解决我原以为是一个简单的问题,但过去几个小时一直让我对着电脑大喊大叫的问题。

下面是我代码中相关的部分:

from PIL import Image, ExifTags
import piexif
currImage = Image.open(inFileName)
exif_dict = piexif.load(currImage.info["exif"])
for orientation in ExifTags.TAGS.keys():
    if ExifTags.TAGS[orientation]=='Orientation':
        break
exif=dict(currImage._getexif().items())
if exif[orientation] == 3:
    currImage=currImage.rotate(180, expand=True)
elif exif[orientation] == 6:
    currImage=currImage.rotate(270, expand=True)
elif exif[orientation] == 8:
    currImage=currImage.rotate(90, expand=True)
currWidth, currHeight = currImage.size
# 这里我只能选择一个。我对如何同时获取两者的知识不足
exif_bytes = piexif.dump(exif_dict)
#exif_bytes = piexif.dump(exif)
maxImageDimension = [1280, 640, 360, 160]
for imgDim in maxImageDimension:
    thumbRatio = imgDim / max(currWidth, currHeight)
    # 注意,由于Python的round函数在数学上是不正确的,我必须进行以下变通
    newWidth = int(Decimal(str(thumbRatio * currWidth)).quantize(Decimal('0.'), rounding=ROUND_UP))
    newHeight = int(Decimal(str(thumbRatio * currHeight)).quantize(Decimal('0.'), rounding=ROUND_UP))
    # 复制currImage对象
    newImage = currImage
    # 注意,由于thumbnail方法存在同样的四舍五入问题,我必须使用resize方法
    newImage = newImage.resize((newWidth, newHeight))
    # 保存缩略图
    if imgDim == 1280:
        outFileName = destinationDir + '\\' + file[:len(file)-4] + '.jpg'
    else:
        outFileName = destinationDir + '\\' + file[:len(file)-4] + '-' + str(newWidth) + 'x' + str(newHeight) + '.jpg'
    print('Writing: ' + outFileName)
    # 这里是我在保存时必须在exif和exif_bytes之间选择的地方,但我只能得到其中一个期望的结果
    newImage.save(outFileName, exif=exif_bytes)  
print('\n')
currImage.close()
newImage.close()

提前感谢您的帮助。

0