pillow-heif无法读取HEIC照片EXIF数据的跨平台解决方法咨询
解决Windows/MacOS下用pillow-heif提取HEIC照片EXIF数据的问题
你遇到的问题是因为img._getexif()是Pillow的旧私有API,pillow-heif的HeifImageFile对象并未实现该方法,导致无法正确读取EXIF。以下是兼容双系统、无需转格式的解决方案:
修正后的代码
from PIL import Image, ImageExif from pillow_heif import register_heif_opener import os def get_exif_data_pillow(file, folder_path): """Retrieve EXIF data from HEIC image using pillow-heif and Pillow's ImageExif""" register_heif_opener() try: with Image.open(os.path.join(folder_path, file)) as img: # 从pillow-heif的原生HEIC对象中获取原始EXIF字节 exif_bytes = img.heif_file.exif if not exif_bytes: return None # 用Pillow的ImageExif解析二进制EXIF数据 exif_parser = ImageExif.ImageExif(exif_bytes) # 获取主IFD(包含基础EXIF信息),如需细分信息可切换IFD编号: # - 1: EXIF子IFD(相机参数、拍摄时间等) # - 2: GPS IFD(定位信息) return exif_parser.get_ifd(0) except Exception as e: print(f"读取EXIF失败: {e}") return None
关键说明
- 直接读取
img.heif_file.exif:这是pillow-heif存储原始EXIF二进制数据的字段,能确保拿到照片本身带有的所有EXIF信息。 - 用
ImageExif解析:Pillow的ImageExif类是专门处理EXIF二进制数据的工具,比旧的_getexif()更可靠,也能兼容更多标签格式。 - 无格式转换:整个过程直接操作HEIC文件,完全符合你高效处理的需求,同时兼容Windows和MacOS。
如果需要提取特定类型的EXIF信息,比如拍摄时间或GPS坐标,可以针对性地读取对应IFD的标签,例如:
# 获取拍摄时间(来自EXIF子IFD) exif_exif_ifd = exif_parser.get_ifd(1) shoot_time = exif_exif_ifd.get(36867) # 36867是DateTimeOriginal的标签编号
内容的提问来源于stack exchange,提问作者Janel Semple
相关产品推荐
相关产品推荐

