Python定义以输入图像为参数的裁剪函数遇报错求助
如何用PIL将图像裁剪为正方形?
你的代码里存在几个关键问题,下面逐一说明并给出修正方案:
问题分析
- 尺寸变量颠倒:PIL Image的
size属性是(宽度, 高度),你错误地将h赋值为宽度、w赋值为高度,逻辑完全颠倒。 - 裁剪尺寸计算错误:你的宽高调整逻辑不符合需求,比如
w = w - (h-w)会得到w = 2w - h,这不是正方形需要的边长,正确逻辑应该取宽高中的较小值作为正方形边长。 - crop参数不合法:PIL的
crop()方法需要传入四元组(left, upper, right, lower)(左上角x、左上角y、右下角x、右下角y),你只传了两个值,导致tuple索引越界。 - 函数无返回值:
make_square函数没有返回裁剪后的图像,调用后imsquare会是None,执行show()会报错。 - 关于最初的
im.shape问题:im.shape是OpenCV图像对象的属性,PIL Image没有这个属性,所以调用会失效。
修正后的代码
裁剪函数:
def make_square(im): # 正确获取图像宽高(PIL size格式:(宽, 高)) w, h = im.size # 取宽高中的较小值作为正方形边长 square_size = min(w, h) # 计算居中裁剪的坐标(用整数除法确保坐标为整数) left = (w - square_size) // 2 upper = (h - square_size) // 2 right = left + square_size lower = upper + square_size # 执行裁剪并返回结果 cropped_im = im.crop((left, upper, right, lower)) return cropped_im
调用代码(无需修改,确保函数有返回值即可):
from PIL import Image from check2_helper import make_square im1 = Image.open('ca.jpg') imsquare = make_square(im1) imsquare.show()
说明
- 采用居中裁剪的方式,把图像多余的部分平均分配到上下/左右两侧,保证裁剪后的正方形是图像的中心区域。
- 用
min(w, h)获取正方形边长,兼容宽大于高、高大于宽两种情况。 - 函数返回裁剪后的图像对象,确保调用后能正常执行
show()方法。
内容的提问来源于stack exchange,提问作者em_
相关产品推荐
相关产品推荐

