使用PIL的Image.thumbnail保存图片报错:NoneType无save属性
问题解决:NoneType object has no attribute save
错误原因
你的代码里这一行是核心问题:
img = img.thumbnail(size, resample=PIL.Image.NEAREST)
Image.thumbnail()是原地修改图片对象的方法,它不会返回新的Image实例,执行后返回的是None。你把这个返回值赋值给img,导致后续img.save()调用时,img已经变成None,所以触发了这个错误。
修正后的代码
from PIL import Image import os from glob import glob # 遍历当前目录下所有png文件 imgs = [y for x in os.walk(".") for y in glob(os.path.join(x[0], '*.png'))] target_size = (32, 32) last_dir = None for file_path in imgs: # 打开图片 img = Image.open(file_path) # 直接调用thumbnail,不需要重新赋值 img.thumbnail(target_size, resample=Image.NEAREST) # 替换路径中的img为icon new_file_path = file_path.replace('img', 'icon', 1) # 避免重复添加.png后缀 if not new_file_path.endswith('.png'): new_file_path += '.png' # 创建目标目录(exist_ok=True避免重复创建报错) target_dir = os.path.dirname(new_file_path) os.makedirs(target_dir, exist_ok=True) # 打印目录信息(仅当目录变化时) if target_dir != last_dir: print(target_dir) last_dir = target_dir # 保存图片 img.save(new_file_path, "PNG")
额外优化说明
- 简化PIL导入,直接用
Image.NEAREST即可,无需单独导入PIL模块 - 用
os.makedirs(target_dir, exist_ok=True)替代try-except块,代码更简洁 - 增加后缀检查,避免原文件已为.png时,保存成
xxx.png.png的问题 - 变量名更清晰(如
file改为file_path,dir改为target_dir),避免与内置关键字冲突
内容的提问来源于stack exchange,提问作者Lufims
相关产品推荐
相关产品推荐

