You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 14:20:17