如何用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
相关产品推荐
相关产品推荐

