PIL调用_getexif()方法抛出AttributeError错误如何解决
报错根因
AttributeError: _getexif 出现的核心是你调用该方法的对象并非支持EXIF读取的原始PIL Image实例,结合你给出的代码和异常现象,具体触发原因分为三点:
- 你读取EXIF用的是缩放后的图像对象,而非原始加载对象
PIL的resize等图像处理接口返回的新Image对象不会继承原始图像的EXIF数据,且多数版本中这类处理后的对象会直接移除_getexif私有方法,自然调用失败。 - 全局变量被意外覆盖
你原有Label赋值逻辑存在变量命名冲突,大概率是笔误把ImageTk.PhotoImage实例或者Label控件实例赋值给了全局变量image_object,这类非PIL Image对象肯定没有_getexif方法。你换新建Label的写法时刚好避开了这个赋值错误,因此可以正常运行。 - 方法已被新版本Pillow废弃
Pillow 9.1.0及以上版本已经正式移除了私有方法_getexif(),无论什么对象调用该方法都会报错,官方推荐使用公有的getexif()方法替代。
修复方案
1. 拆分存储原始图像和展示用图像
单独存储Image.open返回的原始图像用于读取EXIF,缩放后的图像仅用于界面展示,避免EXIF丢失:
# 新增全局变量存原始加载的图像 raw_image = None image_object = None def browse_image(): global raw_image, image_object root.filename = filedialog.askopenfilename(initialdir="/", title="Select An Image", filetypes=(("jpeg files", "*.jpeg"), ("png files", "*.png"))) # 原始图像存入raw_image,仅用于读取EXIF raw_image = Image.open(root.filename) # 缩放后的图像存入image_object,仅用于界面展示 image_object = raw_image.resize((450, 350), Image.ANTIALIAS) image_loaded = ImageTk.PhotoImage(image_object) img_lbl.configure(image=image_loaded) img_lbl.image = image_loaded exif_lbl.configure(text="")
2. 修正EXIF读取逻辑
使用官方推荐的公有方法读取EXIF,同时增加异常判断避免崩溃:
from PIL.ExifTags import TAGS def get_exif(): global raw_image # 仅JPEG格式支持EXIF存储 if raw_image.format not in ("JPEG", "JPG"): print("当前图像格式不支持EXIF读取") return exif_data = raw_image.getexif() if not exif_data: print("当前图像无EXIF信息") return for tag_id in exif_data: tag_name = TAGS.get(tag_id, tag_id) value = exif_data.get(tag_id) print(f"{tag_name:25}: {value}")
3. 清理变量冲突
检查全代码中对image_object、raw_image的赋值逻辑,避免将非PIL Image类型的对象赋值给这两个变量,即可解决Label写法影响运行结果的异常。
内容的提问来源于stack exchange,提问作者this.jind
相关产品推荐
相关产品推荐

