在Python中旋转具有EXIF中指定方向的图像,不使用PIL包括缩略图。
在Python中旋转具有EXIF中指定方向的图像,不使用PIL包括缩略图。
我有以下情况:
- 我从iPhone发送图像以及EXIF信息到我的Python套接字服务器。
- 我需要根据图像拍摄时的实际方向正确定位图像。我知道IOS始终将图像保存为横向左侧,并添加实际方向作为EXIF字段(EXIF.Image.Orientation)。
- 我正在读取EXIF字段以查看实际方向。然后我使用wxpython将图像旋转到正确的方向。
我使用pyexiv2进行EXIF操作。
问题:使用wxpython旋转图像时,包括缩略图在内的EXIF信息丢失。
我做了什么:在旋转图像之前,我读取EXIF。我重置了EXIF中的方向字段。然后在旋转后将其放回。
问题:
EXIF中的缩略图没有旋转。因此,图像和缩略图具有不同的方向。
问题?
除了PIL之外,是否有其他模块可以旋转图像并保留其EXIF信息?
是否有专门用于缩略图方向的EXIF字段?
是否有办法只旋转缩略图?
谢谢你的帮助...
问题出现的原因是:使用Pillow库的版本大于等于6.0.0时,可以使用内置的ImageOps.exif_transpose函数根据图片的exif标签正确旋转图片。但是,当尝试使用这个函数时,出现了"AttributeError: module 'PIL.ImageOps' has no attribute 'exif_transpose'"的错误。
解决方法是:更新Pillow库的版本至6.0.0以上。然后,使用以下代码来旋转图片:
from PIL import ImageOps image = ImageOps.exif_transpose(image)
需要注意的是,这个函数对于tif格式的图片不起作用。如果遇到这种情况,可以参考链接https://github.com/python-pillow/Pillow/issues/4346中的评论。另外,在使用.png格式的图片时,如果上述方法不起作用,可以参考plhn评论链接(需要PIL 7.0版本)。
问题的出现原因是:当图片被拍摄时,根据设备的方向,图片的EXIF信息中会包含一个方向标签。然而,有时候这些图片的方向并不正确,需要根据EXIF信息进行旋转。
解决方法如下:
1. 导入所需的库:PIL和ExifTags。
2. 使用try-except结构处理异常情况。
3. 打开图片并获取其EXIF信息。
4. 遍历EXIF信息,找到方向标签。
5. 根据方向标签的值,进行相应的旋转操作。
6. 保存旋转后的图片并关闭。
7. 如果图片没有EXIF信息,或者无法获取EXIF信息,则跳过处理。
8. 最后,通过判断图片的EXIF信息中的方向值,确定图片是否需要进行旋转。
代码示例:
from PIL import Image, ExifTags try: image = Image.open(filepath) for orientation in ExifTags.TAGS.keys(): if ExifTags.TAGS[orientation] == 'Orientation': break exif = image._getexif() if exif[orientation] == 3: image = image.rotate(180, expand=True) elif exif[orientation] == 6: image = image.rotate(270, expand=True) elif exif[orientation] == 8: image = image.rotate(90, expand=True) image.save(filepath) image.close() except (AttributeError, KeyError, IndexError): pass
在上述解决方法中,使用了PIL库来处理图片,并使用ExifTags库来获取图片的EXIF信息。首先,通过打开图片并获取其EXIF信息,然后根据方向标签的值进行相应的旋转操作,最后保存旋转后的图片。如果图片没有EXIF信息,或者无法获取EXIF信息,则直接跳过处理。
在代码示例中,使用了try-except结构来处理异常情况。首先导入所需的库,然后使用try来执行主要的旋转操作。如果在执行过程中出现了AttributeError、KeyError或IndexError的异常,则直接跳过处理。这样可以避免程序因为异常而中断运行。
通过这种方法,可以根据图片的EXIF信息来旋转图片,从而使图片方向正确显示。
问题的原因是需要在不使用PIL库的情况下,使用Python旋转带有EXIF指定方向的图像,并包括缩略图。解决方法是使用图像的transpose方法根据EXIF中的方向信息进行旋转,并保存旋转后的图像。
具体步骤如下:
1. 导入所需的模块和库。
2. 打开图像文件。
3. 遍历图像的EXIF标签,找到包含方向信息的标签。
4. 获取图像的EXIF信息,并将其保存在字典中。
5. 根据方向信息进行旋转:
- 如果方向为3,则旋转180度。
- 如果方向为6,则旋转270度。
- 如果方向为8,则旋转90度。
6. 保存旋转后的图像文件。
7. 关闭图像文件。
如果图像没有EXIF信息或无法获取EXIF信息,则会捕获异常并继续执行下一步操作。
最后,某些情况下希望能够设置transpose方法中的expand参数为False,但是没有找到如何实现。其他人建议在之前的回答中进行评论,而不是提供一个完全不同的答案。
这个方法看起来很好,并且完美地工作,只是我找不到如何将expand参数设置为False,有没有办法通过transpose方法实现这个功能呢?
最后有人建议在之前的回答中进行评论,而不是提供一个完全不同的答案。对此,提问者表示抱歉,并表示会记住这一点。
以上就是解决在Python中不使用PIL库旋转带有EXIF指定方向的图像的方法。