使用exifread读取HEIC图片时遇'hdlr'错误,如何获取元数据?
解决ExifRead读取HEIC图片时的NoParser: hdlr错误
错误原因
你遇到的NoParser: hdlr错误,是因为ExifRead 3.0.0的HEIC解析模块未实现对hdlr类型box的解析逻辑,而目标HEIC图片恰好包含该未被支持的box。
解决方案
方案1:升级ExifRead到最新版本
执行以下命令升级库,新版本大概率已经补充了对hdlr box的解析支持:
pip install --upgrade exifread
升级完成后重新运行你的原有代码即可。
方案2:手动修改ExifRead的HEIC解析代码(临时修复)
如果升级后问题依旧,可以手动添加对hdlr box的忽略逻辑:
- 找到你的Python环境中ExifRead安装目录下的
heic.py文件(示例路径:c:\Users\Admin\anaconda3\envs\scrape\lib\site-packages\exifread\heic.py) - 在文件中找到
HEICParser类内的defs字典,添加一行解析规则:'hdlr': lambda box: None, - 保存文件后重新运行代码,解析器会跳过
hdlrbox,继续提取其他可解析的元数据。
方案3:换用更成熟的HEIC元数据读取库
如果ExifRead的HEIC支持仍存在局限性,可以使用pyheif配合Pillow实现元数据读取:
from pathlib import Path import pyheif from PIL import Image from PIL.ExifTags import TAGS def extract_heic_exif(file_path): heif_file = pyheif.read(file_path) # 遍历元数据,找到Exif类型的内容 for meta in heif_file.metadata: if meta['type'] == 'Exif': # 利用Pillow解析Exif数据 temp_img = Image.new('RGB', (1, 1)) temp_img.info['exif'] = meta['data'] exif_dict = temp_img._getexif() # 转换为易读的标签名 return {TAGS.get(tag_code): value for tag_code, value in exif_dict.items()} return {} # 测试代码 target_dir = Path(r'C:\Users\Admin\Pictures\Apple media files\gallery\202204') heic_list = list(target_dir.glob('**/*.HEIC')) if heic_list: exif_data = extract_heic_exif(heic_list[0]) print(exif_data)
安装所需依赖:
pip install pyheif pillow
内容的提问来源于stack exchange,提问作者questionto42
相关产品推荐
相关产品推荐

