在Python中,如何读取图片的EXIF数据?

179 投票
10 回答
266630 浏览
提问于 2025-04-16 10:24

我正在使用PIL库。请问我该如何把一张图片的EXIF数据转换成字典格式呢?

10 个回答

47

你还可以使用 ExifRead 这个模块:

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

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

对于Python 3.x版本,使用Pillow 6.x及以上版本,现在的Image对象提供了一个“公开的”/官方的getexif()方法,这个方法会返回一个<class 'PIL.Image.Exif'>实例,如果图片没有EXIF数据,则返回None

来自Pillow 6.0.0的发布说明

新增了getexif()方法,它会返回一个Exif实例。你可以像使用字典一样获取和设置值。当保存JPEG、PNG或WEBP格式的图片时,可以将这个实例作为exif参数传入,以便在输出的图片中包含任何更改。

正如所说的,你可以像遍历普通字典一样遍历Exif实例中的键值对。键是16位的整数,可以通过ExifTags.TAGS模块将它们映射到对应的字符串名称。

from PIL import Image, ExifTags

img = Image.open("sample.jpg")
img_exif = img.getexif()
print(type(img_exif))
# <class 'PIL.Image.Exif'>

if img_exif is None:
    print('Sorry, image has no exif data.')
else:
    for key, val in img_exif.items():
        if key in ExifTags.TAGS:
            print(f'{ExifTags.TAGS[key]}:{val}')
        else:
            print(f'{key}:{val}')

对于出现在ExifTags.TAGS模块中的EXIF键,你应该会看到类似这样的内容:

ExifVersion:b'0230'
...
FocalLength:(2300, 100)
ColorSpace:1
...
Model:'X-T2'
Make:'FUJIFILM'
LensSpecification:(18.0, 55.0, 2.8, 4.0)
...
DateTime:'2019:12:01 21:30:07'
...

测试环境为Python 3.8.8和Pillow 8.1.0。

235

你可以使用PIL图像库中的一个叫做_getexif()的保护方法。

import PIL.Image
img = PIL.Image.open('img.jpg')
exif_data = img._getexif()

这个方法会返回一个字典,里面的内容是用EXIF的数字标签作为索引。如果你想要一个用实际的EXIF标签名称作为索引的字典,可以试试下面这种方法:

import PIL.ExifTags
exif = {
    PIL.ExifTags.TAGS[k]: v
    for k, v in img._getexif().items()
    if k in PIL.ExifTags.TAGS
}

撰写回答