PIL 读取 jpeg 图像内嵌 XMP 元数据

2015-08-14 21:45:09 +08:00
 ChiChou
XMP 是 Adobe 定义的一种数字图像元数据标准。如 Adobe Lightroom 处理过的图片中会嵌入 XMP 元数据,可以用 Photoshop 进行查看。

一些摄影应用如 Google 的全景漫游照相机 Photosphere 也会将一些拍摄时的数据使用 XMP 格式嵌入到图片中。我在编写一段脚本的时候想取出这些元数据进行解析,在网上一顿乱搜都没有发现 PIL 有支持读取 XMP 的迹象,倒是可以使用 _getexif() 方法获取图片的 EXIF 元数据。

而其他可以获取元数据的库如 python-xmp-toolkit 等,编译起来还要带上一大坨依赖项。看了网上还有人出馊主意直接以文本方式打开整个文件,然后查找关键字来确定偏移的。一度想过要研究一下 JFIF 标记格式手动解析,比如参考这个 C 语言实现的 jHead: http://www.sentex.net/~mwandel/jhead/

虽然我最后没有疯狂到用 py 重写 jHead,不过 jHead 的代码倒是给了点启发。去看看 PIL 对 exif 解析的实现,可能还有料。最后在 Github 仓库里扫了一圈 PIL 的代码,终于发现了 JpegImageFile 对象的 applist 属性:

https://github.com/python-pillow/Pillow/blob/8faf299ca04b147580a43df6db3a495f45f97607/PIL/JpegImagePlugin.py#L71

Exif 和 XMP 元数据都保存在 APP1 里。只要用 PIL 打开图像,获得 JpegImageFile 对象之后,遍历其 applist 属性即可读取到元数据 。

下面是完成之后的脚本,处理了一下 PhotoSphere 的标记:

https://gist.github.com/ChiChou/2339b1317c61fa6a6061
3824 次点击
所在节点    Python
2 条回复
zhicheng
2015-08-14 22:47:16 +08:00
ChiChou
2015-08-14 23:09:44 +08:00
好吧,文章有误,此处的 PIL 指的是 Pillow

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/213289

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX