如何使用PIL从PNG文件裁剪所有指定大小正方形并计算平均RGB值
问题修复方案
错误原因
Image.size返回值顺序为(宽度, 高度),你将image_height和image_width赋值颠倒- PIL的
crop()方法接收的参数是(左, 上, 右, 下)坐标元组,你直接传入了裁剪宽高,导致裁剪区域无效,返回无像素的空图片,计算均值时触发空数据报错 - 循环边界未包含最后一个有效裁剪位置,会漏掉最右侧和最下侧的裁剪块
修复后完整代码
from PIL import Image from statistics import mean # 输入正方形裁剪边长,如需保留宽高分开输入可自行调整 print("Input square crop size: ") crop_size = int(input()) image = Image.open('daisy/5547758_eea9edfd54_n.jpg') img_width, img_height = image.size print(f"Original image size: {img_width}x{img_height}") # 裁剪尺寸合法性校验 if crop_size > img_width or crop_size > img_height: print("Error: 裁剪尺寸不能大于原图尺寸") exit() # 遍历所有有效裁剪位置 for y in range(0, img_height - crop_size + 1): for x in range(0, img_width - crop_size + 1): # 构造正确的裁剪区域坐标 box = (x, y, x + crop_size, y + crop_size) print(f"Crop box: {box}") cropped_image = image.crop(box) # 计算平均RGB值 average_color = [round(mean(cropped_image.getdata(band))) for band in range(3)] print(f"Average RGB: {average_color}")
修改说明
- 修正了原图宽高的赋值顺序,匹配
Image.size的返回规则 - 修正了裁剪参数
box的构造逻辑,按左上角+右下角坐标传入,保证裁剪区域有效 - 新增裁剪尺寸合法性校验,避免输入尺寸超过原图时的异常
- 调整循环边界范围,加入
+1保证最后一个有效裁剪位置被遍历到 - 如需支持非正方形裁剪,只需把
crop_size拆回crop_width和crop_height,对应调整box构造和合法性校验逻辑即可
内容的提问来源于stack exchange,提问作者neekitit
相关产品推荐
相关产品推荐

