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

Python提取HEIC文件GPS位置信息异常如何解决

问题根因
  • HEIC格式通过pillow_heif注册到PIL后,没有实现私有方法_getexif(),直接调用会抛出AttributeError: _getexif错误。该方法属于PIL的内部私有接口,本身不保证跨格式、跨版本的兼容性。
  • 替换为公开方法getexif()后拿到的是PIL官方的Exif对象,对象中GPSInfo字段存储的是GPS IFD(图像文件目录)的偏移标识,不是直接嵌套的GPS元数据字典,直接读取只会拿到类似1234的数字值,无法直接解析。
修复方法

使用PIL Exif对象自带的get_ifd()方法获取GPS元数据,该接口会自动根据偏移值解析对应目录的真实内容,原生兼容JPG、HEIC两种格式,不需要单独写格式判断逻辑。
修复后完整可运行代码如下:

#coding=utf-8
from PIL import Image
from PIL.ExifTags import TAGS, GPSTAGS, IFD
from pillow_heif import register_heif_opener

def get_exif(filename):
    image = Image.open(filename)
    image.verify()
    # verify调用后会释放文件句柄,重新打开保证EXIF读取正常
    image = Image.open(filename)
    return image.getexif()

def get_geotagging(exif):
    if not exif:
        raise ValueError("No EXIF metadata found")
    # 统一通过IFD接口获取GPS信息,自动兼容不同图片格式
    gps_ifd = exif.get_ifd(IFD.GPSInfo)
    if not gps_ifd:
        raise ValueError("No EXIF geotagging found")

    geotagging = {}
    for (key, val) in gps_ifd.items():
        geotagging[GPSTAGS.get(key, key)] = val
    return geotagging

register_heif_opener()

my_image='IMG_9610.HEIC'
#my_image='IMG_20210116_215317.jpg'

exif = get_exif(my_image)
labeled = get_geotagging(exif)
print(labeled)
补充说明
  • 所有EXIF读取逻辑都建议使用PIL公开的getexif()接口,不要依赖_getexif()这类私有方法,避免后续版本更新、格式兼容问题。
  • 如果需要将返回的度分秒格式GPS坐标转换为常用的十进制经纬度,可以额外加一层坐标转换逻辑即可。

内容的提问来源于stack exchange,提问作者LA_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 01:39:18