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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 12:05:43