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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 07:36:03