Skip to main content

从 tiff 和 jpeg 文件中读取 Exif 元数据。

项目描述

易于使用的 Python 模块从数字图像文件中提取 Exif 元数据。

支持的格式:TIFF、JPEG、PNG、Webp、HEIC

兼容性

EXIF.py 在 Python 3.5 到 3.10 上经过测试并得到官方支持

从版本3.0.0 开始,完全放弃了 Python2 兼容性(由于类型提示导致的语法错误)。

https://pythonclock.org/

安装

稳定版

推荐的过程是安装PyPI 包,因为它可以轻松保持最新状态:

$ pip install exifread

有关更多信息,请参阅pip 文档

EXIF.py 是成熟的软件,力求稳定。

开发版

克隆 repo 后,使用提供的 Makefile:

make venv reqs-install

它将安装虚拟环境并安装开发依赖项。

用法

命令行

一些例子:

EXIF.py image1.jpg
EXIF.py -dc image1.jpg image2.tiff
find ~/Pictures -name "*.jpg" -o -name "*.tiff" | xargs EXIF.py

显示命令行选项:

EXIF.py -h

Python 脚本

import exifread
# Open image file for reading (must be in binary mode)
f = open(path_name, 'rb')

# Return Exif tags
tags = exifread.process_file(f)

注意:要在项目中将此库用作 Git 子模块,您应该:

from <submodule_folder> import exifread

返回的标签将是一个字典,将 Exif 标签的名称映射到它们在 path_name 命名的文件中的值。您可以根据需要处理标签。特别是,您可以使用以下命令遍历所有标签:

for tag in tags.keys():
    if tag not in ('JPEGThumbnail', 'TIFFThumbnail', 'Filename', 'EXIF MakerNote'):
        print "Key: %s, value %s" % (tag, tags[tag])

if语句用于避免打印出一些往往很长或很无聊的标签。

标签字典将包括所有常用 Exif 标签的键,还将包括一些相机使用的 Makernotes 的键,我们对此有很好的规范。

请注意,字典键是 IFD 名称后跟标签名称。例如:

'EXIF DateTimeOriginal', 'Image Orientation', 'MakerNote FocusMode'

标签说明

标签分为以下主要类别:

  • Image:与主图像相关的信息(Exif 数据的 IFD0)。

  • 缩略图:与缩略图相关的信息(如果存在)(Exif 数据的 IFD1)。

  • EXIF:Exif 信息(子 IFD)。

  • GPS:GPS 信息(子 IFD)。

  • 互操作性:互操作性信息(子 IFD)。

  • MakerNote:制造商特定信息。这些标签没有官方发布的参考资料。

处理选项

这些选项既可以在命令行模式下使用,也可以在脚本中使用。

更快的处理

不要处理 makernote 标签,不要提取缩略图(如果有)。

传递-q--quick命令行参数,或作为:

tags = exifread.process_file(f, details=False)

仅处理 makernotes,而不提取缩略图(如果有):

tags = exifread.process_file(f, details=True, extract_thumbnail=False)

停在给定的标签

在检索到指定标记后停止处理文件。

传递-t TAG--stop-tag TAG参数,或作为:

tags = exifread.process_file(f, stop_tag='TAG')

其中TAG是有效的标签名称,例如'DateTimeOriginal'

上述两个选项对于加快处理大量文件很有用。

严格处理

在无效标签上返回错误,而不是默默地忽略。

传递-s--strict参数,或作为:

tags = exifread.process_file(f, strict=True)

使用示例

这个例子展示了如何使用库在显示图像之前校正图像的方向(使用 Pillow 进行转换)。

import exifread
from PIL import Image
import logging

def _read_img_and_correct_exif_orientation(path):
    im = Image.open(path)
    tags = {}
    with open(path, 'rb') as f:
        tags = exifread.process_file(f, details=False)
    if "Image Orientation" in tags.keys():
        orientation = tags["Image Orientation"]
        logging.basicConfig(level=logging.DEBUG)
        logging.debug("Orientation: %s (%s)", orientation, orientation.values)
        val = orientation.values
        if 2 in val:
            val += [4, 3]
        if 5 in val:
            val += [4, 6]
        if 7 in val:
            val += [4, 8]
        if 3 in val:
            logging.debug("Rotating by 180 degrees.")
            im = im.transpose(Image.ROTATE_180)
        if 4 in val:
            logging.debug("Mirroring horizontally.")
            im = im.transpose(Image.FLIP_TOP_BOTTOM)
        if 6 in val:
            logging.debug("Rotating by 270 degrees.")
            im = im.transpose(Image.ROTATE_270)
        if 8 in val:
            logging.debug("Rotating by 90 degrees.")
            im = im.transpose(Image.ROTATE_90)
    return im

信用

非常感谢多年来所有的贡献者!

最初由 Gene Cash 和 Thierry Bousch 撰写。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

ODMExifRead-3.0.4.tar.gz (39.8 kB 查看哈希

已上传 source

内置分布

ODMExifRead-3.0.4-py3-none-any.whl (41.0 kB 查看哈希

已上传 py3