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

使用PIL处理图片时Image.save报AttributeError: 'NoneType'无save属性

问题解决:AttributeError: 'NoneType' object has no attribute 'save'

核心错误原因

PIL库的Image.paste()方法是原地修改当前图片对象,不会返回新的Image实例,所以你执行new = old.paste(shirt, shirt)后,new的值是None,调用new.save()自然会触发AttributeError。

修复步骤

  1. 移除new =的赋值操作,直接在修改后的old对象上调用save方法;
  2. 修正异常捕获的写法(原写法逻辑错误,无法正确捕获两种异常);
  3. 可选:修正拼写错误(suppurted formet改为supported formats,不影响功能但更规范)。

修复后的完整代码

import sys
from PIL import Image, ImageOps
import os
import PIL

# supported formats
spfr = [".jpeg", ".jpg", ".png"]

# check command-line arguments
if len(sys.argv) < 3:
    sys.exit("Too few command-line arguments")
elif len(sys.argv) > 3:
    sys.exit("Too many command-line arguments")

src_ext = os.path.splitext(sys.argv[1])[1].lower()
dst_ext = os.path.splitext(sys.argv[2])[1].lower()

if src_ext != dst_ext:
     sys.exit("Not same extension")
elif src_ext not in spfr:
    sys.exit("Not an image")

# open images
try:
    shirt = Image.open("shirt.png")
    old = Image.open(sys.argv[1])
except (FileNotFoundError, PIL.UnidentifiedImageError):
    sys.exit("Image file not found or cannot be identified")

shirt_size = shirt.size
old = ImageOps.fit(old, shirt_size)

# 直接在old上执行paste,无需赋值给新变量
old.paste(shirt, shirt)

# 保存修改后的old对象
old.save(sys.argv[2])

额外说明

  • 如果需要保留原始的old图片对象不被修改,可以先创建副本再操作:
    new = old.copy()
    new.paste(shirt, shirt)
    new.save(sys.argv[2])
    
  • 新增了.lower()处理文件扩展名,避免大小写不一致导致的判断错误(比如.PNG和.png)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 16:32:39