V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
ChiChou
V2EX  ›  Python

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

  •  
  •   ChiChou · 2015-08-14 21:45:09 +08:00 · 3824 次点击
    这是一个创建于 3390 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 的标记:

    2 条回复    2015-08-14 23:09:44 +08:00
    zhicheng
        1
    zhicheng  
       2015-08-14 22:47:16 +08:00
    ChiChou
        2
    ChiChou  
    OP
       2015-08-14 23:09:44 +08:00
    好吧,文章有误,此处的 PIL 指的是 Pillow
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2942 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 14:33 · PVG 22:33 · LAX 06:33 · JFK 09:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.