修改或删除Exif标签';方向';用Python

修改或删除Exif标签';方向';用Python,python,python-imaging-library,exif,Python,Python Imaging Library,Exif,无论软件是否读取exif数据,我都需要一些图片以相同的方向显示。一种解决方案(实际上唯一适合的方法)是根据exif标记(如果存在)旋转图像,然后删除或将该标记修改为“1” 示例 假设图像的方向exif标记设置为3。我想做的是根据这个标签旋转这个图像,并以这种方式保存它。因此,不解释exif的软件仍将以良好的方向显示它。虽然如果exif标记方向仍然设置为3,那么解释exif的软件将旋转我已经旋转的图像。这就是为什么我想把这个标签设为1(意思是:没有方向)或者删除它 我的最终目标是,无论使用哪种软件

无论软件是否读取exif数据,我都需要一些图片以相同的方向显示。一种解决方案(实际上唯一适合的方法)是根据exif标记(如果存在)旋转图像,然后删除或将该标记修改为“1”

示例
假设图像的方向exif标记设置为3。我想做的是根据这个标签旋转这个图像,并以这种方式保存它。因此,不解释exif的软件仍将以良好的方向显示它。虽然如果exif标记方向仍然设置为3,那么解释exif的软件将旋转我已经旋转的图像。这就是为什么我想把这个标签设为1(意思是:没有方向)或者删除它

我的最终目标是,无论使用哪种软件打开图像,图像都将始终以相同的方式显示。

关于这一点有很多问题,Exif和Python等等。以下是我听说的LIB列表:

  • Pyexiv2:不适合,我目前正在使用Python3.3和枕头
  • Gexiv2:看起来有点平台特定
  • EXIF.py
  • :看起来像是最近的一个
最佳实践是什么?有没有纯python的解决方案?(我可以用pip安装它,并将它放在我的requirements.txt中)是否有某种新的库我可以使用,它是Python3特有的


我现在唯一的问题是修改这些exif数据并将其写入映像文件。我可以读取exif数据,并根据方向标记旋转图像。有什么提示或建议吗?

您可以使用枕头保存Exif数据

img.save(output, img_format, quality, exif=img_info.get('exif'))
注: 这个答案适用于Python2.7——在Python3中,你可以用枕头换成PIL,但根据经验,我不能这么说。请注意,与pyexiv2和大多数其他允许您修改EXIF元数据的包不同,pexif库是独立的纯python库,因此它不需要绑定到计算机上可能不存在的任何C库

概述: 这两个步骤需要使用两个单独的工具:

  • 修改元数据(EXIF标记)的步骤
  • 旋转图像的步骤
pexif部分: 四个步骤:

  • 打开图像
  • 检查方向(稍后需要旋转)
  • 将方向更改为1
  • 保存图像
如果找不到方向标记,则会产生AttributeError,因此会出现
try:
。还要注意,pexif需要方向标记是一个列表(带有一个元素)

导入pexif
img=pexif.JpegFile.fromFile(临时目录+文件名)
尝试:
#获取方向(如果存在)
方向=img.exif.primary.orientation[0]
img.exif.primary.Orientation=[1]
img.writeFile(临时目录+文件名)
PIL部分: 现在旋转图像。可能方向(用于生成旋转查找表)含义的来源为

  • 打开图像
  • 应用必要的旋转/反射
  • 保存图像
从PIL导入图像
img=Image.open(临时目录+文件名)
如果方向为6:img=img.旋转(-90)
elif方向为8:img=img.旋转(90)
elif方向为3:img=img.旋转(180)
elif方向为2:img=img.transpose(Image.FLIP\u LEFT\u RIGHT)
elif方向为5:img=img.rotate(-90).transpose(Image.FLIP\u LEFT\u RIGHT)
elif方向为7:img=img.rotate(90).transpose(Image.FLIP\u LEFT\u RIGHT)
elif方向为4:img=img.rotate(180).transpose(Image.FLIP\u LEFT\u RIGHT)
#保存结果
img.save(临时目录+文件名)
总而言之:
如果ctype=='image/jpeg':
从PIL导入图像
进口pexif
img=pexif.JpegFile.fromFile(临时目录+文件名)
尝试:
#获取方向(如果存在)
方向=img.exif.primary.orientation[0]
img.exif.primary.Orientation=[1]
img.writeFile(临时目录+文件名)
#现在使用Python图像库(PIL)旋转图像
img=Image.open(临时目录+文件名)
如果方向为6:img=img.旋转(-90)
elif方向为8:img=img.旋转(90)
elif方向为3:img=img.旋转(180)
elif方向为2:img=img.transpose(Image.FLIP\u LEFT\u RIGHT)
elif方向为5:img=img.rotate(-90).transpose(Image.FLIP\u LEFT\u RIGHT)
elif方向为7:img=img.rotate(90).transpose(Image.FLIP\u LEFT\u RIGHT)
elif方向为4:img=img.rotate(180).transpose(Image.FLIP\u LEFT\u RIGHT)
#保存结果
img.save(临时目录+文件名)
除了:通过

看看这个Git存储库中的EXIF和Pyxif:


两者都提供了简单和纯Python方法来读取和修改EXIF标记。与PIL或枕头相结合,这些LIB非常棒,它们没有其他大型软件包(如pyexif2)的开销。

我知道这一点。虽然您可以尝试用枕头修改这些数据,但您将无法做到这一点。我想在保存exif数据之前修改它。只是想知道为什么要这样做“然后删除或将此标记修改为“1”。?如果标记设置为“1”,则表示“没有特定方向”。所以解释exif的软件不会旋转图像。如果这个标签不存在,它是完全相同的。我将编辑我的帖子,使其更清晰。另一种可能性是使用如上所述。您首先使用exiftool将exif数据提取到字典中,根据需要处理并保存图像(如旋转),然后再次使用exiftool将修改后的exif数据复制到新文件中。@Ondro:exiftool支持修改标记吗,还是需要PIL来完成原因PIL不支持Python 3.x。请注意:
piexif
绝对是Python 3的最佳解决方案。这是一个伟大的信息,即使是大型服务也无法获得正确的信息。。。谢谢分享!