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_
相关产品推荐
相关产品推荐

