Windows11下用Python3.10提取.heic图片元数据的问题
解决Windows 11 + Python 3.10提取HEIC图片元数据的问题
针对在Windows 11 + Python 3.10环境下提取HEIC元数据遇到的问题,以下是几个可行的解决方案:
1. 用pyheif-with-libheif读取元数据
原版pyheif无Windows预编译包,可安装带依赖的pyheif-with-libheif,内置libheif无需额外编译:
pip install pyheif-with-libheif
示例代码:
import pyheif import exifread from io import BytesIO # 打开HEIC文件 heif_file = pyheif.open("path/to/img.heic") # 获取原始EXIF数据 exif_raw = heif_file.metadata.get("Exif") if exif_raw: # 用ExifRead解析 tags = exifread.process_file(BytesIO(exif_raw)) for tag, value in tags.items(): print(f"{tag}: {value}")
2. 用pillow-heif扩展Pillow支持HEIC
原生Pillow不支持HEIC,安装pillow-heif扩展后即可读取:
pip install pillow-heif
示例代码:
from PIL import Image from pillow_heif import register_heif_opener # 注册HEIC解码器 register_heif_opener() img = Image.open("path/to/img.heic") # 获取并遍历EXIF元数据 exif = img.getexif() for tag_id, value in exif.items(): tag_name = Image.ExifTags.TAGS.get(tag_id, tag_id) print(f"{tag_name}: {value}")
3. 用ExifTool(命令行工具)
如果Python库仍有兼容性问题,可使用成熟的ExifTool工具:
- 下载ExifTool Windows版本,将
exiftool.exe放入系统PATH或项目目录 - Python调用示例:
import subprocess import json # 调用ExifTool获取JSON格式的元数据 result = subprocess.run( ["exiftool", "-j", "path/to/img.heic"], capture_output=True, text=True ) exif_data = json.loads(result.stdout)[0] for key, value in exif_data.items(): print(f"{key}: {value}")
之前尝试失败的原因
- ExifRead的HEIC解析模块兼容性有限,无法处理包含
hdlr盒子的特定HEIC文件 - 原版pyheif依赖libheif库,Windows环境无预编译包,手动编译门槛高
- 原生Pillow未内置HEIC解码器,必须安装扩展才能支持
内容的提问来源于stack exchange,提问作者K.Mulier
相关产品推荐
相关产品推荐

