使用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。
修复步骤
- 移除
new =的赋值操作,直接在修改后的old对象上调用save方法; - 修正异常捕获的写法(原写法逻辑错误,无法正确捕获两种异常);
- 可选:修正拼写错误(
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
相关产品推荐
相关产品推荐

