使用PIL.ExifTags提取图片元数据遇报错,求解决方案
问题解决:PIL提取EXIF报错与exif命令未识别
一、PIL调用_getexif()出现AttributeError的解决
问题原因
cv2.imread()读取图片时会自动丢弃EXIF元数据,转换为PIL图像后,pil_img._getexif()返回None,调用.items()自然触发AttributeError。
解决方法
方法1:直接用PIL读取图片(推荐)
如果不需要先用cv2处理图像,直接用PIL打开即可保留EXIF信息:
from PIL import Image from PIL.ExifTags import TAGS # 直接用PIL读取图片,保留EXIF pil_img = Image.open("keyboard.png") # 先判断EXIF是否存在,避免报错 exif_data = pil_img._getexif() if exif_data: exif = { TAGS[k]: v for k, v in exif_data.items() if k in TAGS } else: print("图片无EXIF元数据或无法读取")
方法2:必须用cv2处理时,单独读取EXIF
若需先用cv2处理图像,可借助第三方库piexif单独读取EXIF:
- 安装依赖:
pip install piexif - 代码示例:
import cv2 import numpy as np from PIL import Image from PIL.ExifTags import TAGS import piexif # cv2处理图像逻辑不变 img = cv2.imread("keyboard.png") convert = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) pil_img = Image.fromarray(convert) # 单独读取原图片的EXIF数据 exif_data = piexif.load("keyboard.png") # 转换为易读格式 exif = {} for tag_id in exif_data["Exif"]: tag = TAGS.get(tag_id, tag_id) exif[tag] = exif_data["Exif"][tag_id] # 读取GPS信息 gps_info = exif_data.get("GPS", {})
二、终端exif命令未识别的解决
问题原因
Windows系统默认没有exif命令,该命令由第三方工具(如ExifTool)提供,未安装则会报错。
解决方法
方法1:安装ExifTool
- 下载对应系统的ExifTool版本(Windows选择
.exe格式) - 将下载的
exiftool.exe重命名为exif.exe,放到系统环境变量PATH包含的文件夹(如C:\Windows\System32) - 重启终端后即可使用
exif命令
方法2:用Python库替代命令行
无需额外安装命令行工具,直接用piexif或PIL读取EXIF,即上述代码中的处理方式,更适配Python开发场景。
内容的提问来源于stack exchange,提问作者ThisGuyThatGuy
相关产品推荐
相关产品推荐

