我正在为 python 寻找好的 exif(可交换图像文件格式)操作库。我更喜欢灵活性(例如,检索提供商专有标签的能力)而不是处理速度。你有什么建议?
12 回答
您可能想查看exif-py:
用于从 tiff 和 jpeg 文件中提取 EXIF 数据的 Python 库。非常容易使用 - $ ./EXIF.py image.jpg
Python 图像库 (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
免责声明:
我实际上不知道哪个是最好的,这只是我能够与谷歌拼凑而成的。:)
我自己最近一直在使用pyexiv2,它似乎非常适合我的需求。也许它也适合你。
基于 Exiv2 的解决方案
Exiv2 (exiv2: http://exiv2.org/ ) 是一个成熟的开源 C++ 库,支持读取和写入多种图像类型(JPEG、PNG、TIFF 和许多原始格式)的元数据,理解标准(Xmp、IPTC和 Exif)和非标准元数据(“Makernotes”),并在多个平台(Windows、Linux 和 Mac)上运行。
与 exiv2 的 Python 绑定是:
- 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)。
本文描述了一个 Python 模块,用于使用纯 Python 编写 EXIF 元数据(而不仅仅是读取它们)。显然,PIL、pyexif 和 EXIF-py 都不支持编写 EXIF。pyexiv2 似乎是前沿且特定于平台的。
使用 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')
http://redmine.yorba.org/projects/gexiv2/wiki上的页面(成为https://wiki.gnome.org/Projects/gexiv2)现在显示:
这将同样适用于 Python 2 或 3,这使得 GExiv2 成为仅支持 Python 2 的 pyexiv2 的绝佳替代品。
因此,现在 GExiv2 支持 Python2 和 Python3。
好消息。
我开始编写自己的基于 PIL 代码的小型库。 在这里检查。
不知何故,我用上面的 Paolo 代码得到了 _getexif 的属性错误。我使用的是 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
我一直在使用我自己的包装器http://www.sno.phy.queensu.ca/~phil/exiftool/ - 原因是它非常完整,开发者非常活跃。并且不能支持几乎所有的图像格式对于需要它的项目来说是一个绝对的阻碍
缺点当然是它不是 python,所以你需要像我一样使用子进程调用。
您还可以在http://www.emilas.com/jpeg/上查看 Gheorghe Milas 的 jpeg.py 库,它是“解析、读取和写入 JPEG EXIF、IPTC 和 COM 元数据的 Python 库”。
一个缺点是他似乎通过 DynDNS 将他的域托管在动态 IP 上,因此它并不总是可用的。
ASPN 上有一些 PIL 和 EXIF.py 使用示例
在 Python 2.6 中,模块的位置不同。用这个:
import Image
from ExifTags import TAGS