在Python中调整图像大小和旋转后保留EXIF信息并保存
在Python中调整图像大小和旋转后保留EXIF信息并保存
我在SO上阅读了关于图像旋转的另一个帖子:
还阅读了SO上关于保留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()
提前感谢您的帮助。