如何从EXIF提取修改日期?get_ifd(0x0132)返回空值问题
问题成因
Pillow 中Exif对象的get_ifd()方法设计用途是读取IFD(图像文件目录)子节点内容,仅当传入的标签是IFD指针类标签时才会返回有效数据。这类标签的存储值是子IFD的文件偏移地址,比如你输出结果里的34853(GPS信息IFD指针)、34665(Exif子IFD指针),才是get_ifd()的合法入参。
ModifyDate标签(标签号0x0132,对应十进制306)是根EXIF目录下的普通值标签,不是IFD入口指针。把这个标签号传入get_ifd()时,程序会尝试查找编号为0x0132的子IFD,该子IFD不存在,因此返回空字典。
正确提取方式
直接从根EXIF字典中读取对应标签值即可,不需要调用get_ifd():
from PIL import Image def get_exif(filename): image = Image.open(filename) image.verify() return image.getexif() def get_exif_date(exif): # 0x0132 为ModifyDate对应的标签号,直接读取即可 return exif.get(0x0132) ff = 'path/to/file.jpg' image_exif = get_exif(ff) image_date = get_exif_date(image_exif) print(image_date) # 对应示例输出:2021:05:02 17:27:18
如果需要兼容部分设备把日期类标签存在Exif子IFD的场景,可以增加兜底逻辑:
def get_exif_date(exif): # 优先读取根目录的ModifyDate modify_date = exif.get(0x0132) if not modify_date: # 读取Exif子IFD下的拍摄日期、数字化日期兜底 exif_ifd = exif.get_ifd(34665) modify_date = exif_ifd.get(0x9003) or exif_ifd.get(0x9004) return modify_date
内容的提问来源于stack exchange,提问作者LA_
相关产品推荐
相关产品推荐

