python的Exif操作库


108

我正在寻找适用于python的良好exif(可交换图像文件格式)操作库。与处理速度相比,我更喜欢灵活性(例如,检索提供商专有标签的能力)。你有什么建议?


也许问题应该读为:“有哪些选项可使用python来强调功能集(例如,检索提供商专有标签的能力以及与多种图像格式的兼容性),从而在速度上使用python编辑Exif(可交换图像文件格式)?”
dlm

1
@Wooble等人:“如果可以改写该问题以符合帮助中心的规则,请编辑该问题或发表评论。” 我做了后者,但是Q结束时没有进一步评论。是什么赋予了?(只是试图理解,如果已经成定局,不想浪费时间评论/编辑问题)
dlm

问这个问题时,我希望其他开发人员发表意见!PackageOpinionOverflow?
Derek Litz

1
请记住,这里几乎所有非exiv2解决方案都将无法访问MakerNote。在此EXIF标签中,相机制造商添加了自己的标签,这些标签可保存有价值的信息。因此,您只能从以下答案中获得大多数库的基本标签。
user136036

Answers:


65

您可能要签出exif-py

从tiff和jpeg文件提取EXIF数据的Python库。非常易于使用-$ ./EXIF.py image.jpg

Python Imaging Library(PIL)

Python Imaging Library(PIL)为您的Python解释器添加了图像处理功能。该库支持多种文件格式,并提供强大的图像处理和图形功能。

还有一个恰当命名的pyexif:http ://pyexif.sourceforge.net/

pyexif python库和工具旨在从包含它的Jpeg和Tiff文件中提取EXIF信息。此信息通常包含在使用数字成像设备(例如,数码相机,数字胶片扫描仪等)创建的图像中。

但是,似乎pyexif尚未更新。他们建议,如果他们的技巧不正确,不能签出EXIF-py,那么您可能应该首先尝试一下,因为他们的sourceforge页面最近似乎有一些活动,尽管数量不多。最后,使用PIL您可以执行以下操作:

from PIL import Image
from PIL.ExifTags import TAGS

def get_exif(fn):
    ret = {}
    i = Image.open(fn)
    info = i._getexif()
    for tag, value in info.items():
        decoded = TAGS.get(tag, tag)
        ret[decoded] = value
    return ret

免责声明
实际上我不知道哪个是最好的,这就是我与Google共同努力的结果。:)


19
这些“解决方案”都不能写回EXIF标记,因此它们不是该问题的解决方案。
odinho-Velmont,2011年

22
尽管从技术上讲不允许编写EXIF标签,但我发现这非常有用。+1用于编写代码。
塞林

3
Python 3.x没有PIL
2013年

不错的概述。请注意:exif-py当前与Python 3.x不兼容(已通过Python 3.3.3测试,另请参见github.com/ianare/exif-py/issues/12)。
2014年

3
@MoreThanFive有一个经过维护的PIL叉子,它与pipgithub.com/python-pillow/Pillow
ibizaman 2014年

59

我最近一直在使用pyexiv2,它似乎非常适合我的需求。也许它也适合您。


9
记录:pyexiv2似乎是它们中维护最好的,也是最完整的(包括将EXIF标记写回到文件中)。
rbp

1
可以将pyexiv2轻松安装在virtualenv内吗?
马特·奥斯汀

2
维护速度似乎有所减慢,在Mac上进行安装真是麻烦极了。:/
Vortexfive 2012年

6
对于那些谁关心:不幸的是,pyexiv2仅适用于Python的2
texnic

1
<QUOTE src =“ redmine.yorba.org/projects/gexiv2/wiki ”>这将与Python 2或3同样有效,这使GExiv2成为仅支持Python 2的pyexiv2的理想替代品。</ QUOTE>
jno

31

基于Exiv2的解决方案

Exiv2(exiv2:http://exiv2.org/ )是一个成熟的开源C ++库,支持将元数据读取和写入多种图像类型(JPEG,PNG,TIFF和许多原始格式),并了解标准(Xmp,IPTC)和Exif)和非标准元数据(“ Makernotes”),并且可以在多种平台(Windows,Linux和Mac)上运行。

Python与exiv2的绑定是:

  • gexiv2(多语言绑定,但适用于python 2.6 / 2.7 / 3.X):https ://wiki.gnome.org/gexiv2
  • pyexiv2(不再受支持,但可与python 2.6 / 2.7一起使用):http ://tilloy.net/dev/pyexiv2/

pyexiv2的一个优点是有一个可用于python 2.7的Windows构建。针对gexiv2的Windows构建请求位于此处:https ://bugzilla.gnome.org/show_bug.cgi?id = 712441

exiv2和绑定都是开源的(GPL)。


基于有关与exiv2绑定的最新信息更新了此文件
dlm

pyexiv2已分叉:py3exiv2.tuxfamily.org
Artem Klevtsov

tilloy.net链接无效
jtlz2

5

本文介绍了一个Python模块,用于使用纯Python编写EXIF元数据(而不仅仅是读取它们)。显然,PIL,pyexif或EXIF-py都不支持编写EXIF。pyexiv2似乎是尖端的,并且是特定于平台的。


不知道是否可以考虑减少出血边缘。
疯狂物理学家

5

使用PIL :)

import os,sys
from PIL import Image
from PIL.ExifTags import TAGS

if __name__ == '__main__':
    for (k,v) in Image.open(sys.argv[1])._getexif().iteritems():
        print '%s = %s' % (TAGS.get(k), v)
    os.system('pause')

1
纯PIL /枕头不允许修改EXIF标签。但是有一个小型图书馆对此
Simon Steinberger


3

您还可以在http://www.emilas.com/jpeg/上查看Gheorghe Milas的jpeg.py库,该库是“用于解析,读取和写入JPEG EXIF,IPTC和COM元数据的python库”。

缺点是他似乎通过DynDNS将其域托管在动态IP上,因此它并不总是可用。


不再存在。
西蒙·斯坦伯格2015年

3

我用上面的Paolo代码以某种方式获得_getexif的attributeError。我正在使用Python 2.6.6和PIL 1.1.7。_getexif现在过时了吗?

这是一个对我有用的小修改。

from PIL import Image
from PIL.ExifTags import TAGS

def get_exif(fn):
    ret = {}
    i = Image.open(fn)
#    info = i._getexif()
    info = i.tag.tags
    for tag, value in info.items():
        decoded = TAGS.get(tag, tag)
        ret[decoded] = value
    return ret


3

我一直在http://www.sno.phy.queensu.ca/~phil/exiftool/周围使用我自己的包装器 -原因是它非常完整,开发人员非常活跃。而且,不支持几乎所有图像格式对于该项目来说绝对是必不可少的。

当然,缺点是它不是python,因此您需要像我一样使用子进程调用。


有一个exiftool的python包装器github.com/smarnach/pyexiftool。对于exiftool非常完整的事实,请投一票。
Long Vu 2012年

他要一个Python库。
Diego Woitasen,2012年


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.