使用PIL.ImageOps.fit()报错:'str'对象无'size'属性
问题:使用PIL.ImageOps.fit()时触发AttributeError错误
我在尝试用PIL.ImageOps.fit()裁剪图片时碰到了错误,以下是我的代码和报错信息:
原代码
import sys from PIL import ImageOps, Image, ImageChops import PIL # 用户命令行输入验证 if len(sys.argv) != 3: sys.exit("参数数量不正确") name, newName = sys.argv[1], sys.argv[2] splitedName, splitedNewName = name.split("."), newName.split(".") formats =["jpg","jpeg","png"] # print(splitedName[1],splitedNewName[1]) if splitedName[1] != splitedNewName[1] and splitedName not in formats: sys.exit("格式不正确!") # 图片处理 shirt = Image.open("shirt.png") size = shirt.size im2 = ImageOps.fit(name,size) im2.paste(shirt,shirt) im2.save(newName)
报错信息
Traceback (most recent call last): File "/home/lev/CS50/shirt/shirt.py", line 26, in <module> im2 = ImageOps.fit(name,size) File "/home/lev/miniconda3/lib/python3.9/site-packages/PIL/ImageOps.py", line 461, in fit bleed_pixels = (bleed * image.size[0], bleed * image.size[1]) AttributeError: 'str' object has no attribute 'size'
解决方法
1. 核心错误修复
ImageOps.fit()的第一个参数要求传入PIL Image对象,但你直接传了字符串类型的文件名name,导致函数内部尝试访问image.size时报错。需要先打开图片文件得到Image对象:
# 替换原代码中的这一行 # im2 = ImageOps.fit(name,size) # 改为: user_img = Image.open(name) im2 = ImageOps.fit(user_img, size)
2. 修正格式验证逻辑
原代码的格式判断逻辑有问题,应该先检查文件后缀是否在允许的格式列表里,再检查前后文件格式是否一致:
# 替换原验证逻辑 if splitedName[1].lower() not in formats or splitedNewName[1].lower() not in formats: sys.exit("文件格式不在允许的列表中!") if splitedName[1].lower() != splitedNewName[1].lower(): sys.exit("输入和输出文件格式必须一致!")
(加上.lower()避免大小写问题,比如JPG和jpg被误判)
3. 优化图片粘贴逻辑
粘贴衬衫图片时,建议使用衬衫的alpha通道作为mask,保证透明背景正常显示:
# 替换原粘贴代码 # im2.paste(shirt,shirt) # 改为: im2.paste(shirt, (0, 0), shirt)
修正后的完整代码
import sys from PIL import ImageOps, Image # 用户命令行输入验证 if len(sys.argv) != 3: sys.exit("参数数量不正确") name, newName = sys.argv[1], sys.argv[2] splitedName, splitedNewName = name.split("."), newName.split(".") formats = ["jpg", "jpeg", "png"] # 格式验证 if splitedName[1].lower() not in formats or splitedNewName[1].lower() not in formats: sys.exit("文件格式必须是jpg、jpeg或png!") if splitedName[1].lower() != splitedNewName[1].lower(): sys.exit("输入和输出文件格式必须一致!") # 图片处理 shirt = Image.open("shirt.png") size = shirt.size # 打开用户图片并裁剪适配尺寸 user_img = Image.open(name) im2 = ImageOps.fit(user_img, size) # 粘贴衬衫图片(保留透明背景) im2.paste(shirt, (0, 0), shirt) im2.save(newName)
内容的提问来源于stack exchange,提问作者TsarinLev
相关产品推荐
相关产品推荐

