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

如何用Python PIL裁切对角线划分的内部区域并保存为独立图片

识别对角线间空白区域并裁切为独立图片

需求

我要识别两条对角线之间的空白区域,把其中的两个三角形和两个梯形分别存成独立图片。目前有生成带红色对角线图片的代码:

def grid(width, height, wq, hq):
    img = Image.new('RGB', (width, height), color='white')
    pic = ImageDraw.Draw(img) 
    for i in range(0, width, wq):
        for j in range(0, height, hq):
            pic.line([(i, j), (i + wq, j + hq)], fill="red", width=10)
    img.show()
grid(600,600,300,300)

实现方法

1. 确定目标区域坐标

你生成的是600x600的图片,两条红色对角线分别是(0,0)-(300,300)和(300,300)-(600,600),四个空白区域的顶点坐标如下:

  • 左上角三角形:(0,0)、(300,0)、(0,300)
  • 右上角梯形:(300,0)、(600,0)、(600,300)、(300,300)
  • 左下角梯形:(0,300)、(300,300)、(300,600)、(0,600)
  • 右下角三角形:(300,300)、(600,300)、(600,600)

2. 编写裁切代码

用PIL的蒙版功能提取目标区域,再裁切保存:

from PIL import Image, ImageDraw

def grid(width, height, wq, hq):
    img = Image.new('RGB', (width, height), color='white')
    pic = ImageDraw.Draw(img) 
    for i in range(0, width, wq):
        for j in range(0, height, hq):
            pic.line([(i, j), (i + wq, j + hq)], fill="red", width=10)
    return img

def make_mask(vertices, img_size):
    # 生成对应区域的蒙版,白色为保留区域
    mask = Image.new('L', img_size, 0)
    draw = ImageDraw.Draw(mask)
    draw.polygon(vertices, fill=255)
    return mask

# 生成原始图片
raw_img = grid(600,600,300,300)

# 定义要裁切的四个区域
target_areas = [
    {"name": "左上角三角形", "points": [(0,0), (300,0), (0,300)]},
    {"name": "右上角梯形", "points": [(300,0), (600,0), (600,300), (300,300)]},
    {"name": "左下角梯形", "points": [(0,300), (300,300), (300,600), (0,600)]},
    {"name": "右下角三角形", "points": [(300,300), (600,300), (600,600)]}
]

# 逐个裁切保存
for area in target_areas:
    mask = make_mask(area["points"], raw_img.size)
    # 用蒙版提取区域
    area_img = Image.new('RGB', raw_img.size, 'white')
    area_img.paste(raw_img, mask=mask)
    # 裁切到区域最小范围
    bbox = mask.getbbox()
    area_img = area_img.crop(bbox)
    # 保存图片
    area_img.save(f"{area['name']}.png")
    print(f"{area['name']}.png 已保存")

代码说明

  • make_mask():根据区域顶点生成蒙版,只保留目标区域的内容
  • 先通过蒙版从原图中提取指定区域,再用getbbox()获取区域的最小边界,裁切后保存,这样得到的就是仅包含空白区域的独立图片

内容的提问来源于stack exchange,提问作者G.Florin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 21:30:28