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

PIL调用_getexif()方法抛出AttributeError错误如何解决

报错根因

AttributeError: _getexif 出现的核心是你调用该方法的对象并非支持EXIF读取的原始PIL Image实例,结合你给出的代码和异常现象,具体触发原因分为三点:

  1. 你读取EXIF用的是缩放后的图像对象,而非原始加载对象
    PIL的resize等图像处理接口返回的新Image对象不会继承原始图像的EXIF数据,且多数版本中这类处理后的对象会直接移除_getexif私有方法,自然调用失败。
  2. 全局变量被意外覆盖
    你原有Label赋值逻辑存在变量命名冲突,大概率是笔误把ImageTk.PhotoImage实例或者Label控件实例赋值给了全局变量image_object,这类非PIL Image对象肯定没有_getexif方法。你换新建Label的写法时刚好避开了这个赋值错误,因此可以正常运行。
  3. 方法已被新版本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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 06:57:03