如何从透明图片创建包含圆角矩形内部像素的黑色遮罩?
解决方案
问题出在convert("L")会丢弃Alpha通道信息,只依据RGB值生成灰度图,导致透明的圆角矩形内部区域被处理成黑色。要生成包含内部所有像素的遮罩,得利用Alpha通道定位形状轮廓,再填充内部区域:
- 读取原图并提取Alpha通道,以此定位圆角矩形的轮廓范围
- 用填充工具将轮廓内部全部设为白色
- 最终生成内部全白、外部全黑的遮罩图
以下是具体实现代码:
from PIL import Image, ImageDraw # 打开带透明通道的原图 img = Image.open("w3VPL.png").convert("RGBA") width, height = img.size # 创建初始全黑的遮罩图(L模式) mask = Image.new("L", (width, height), 0) draw = ImageDraw.Draw(mask) # 获取Alpha通道,取图片中心作为内部填充起始点(可根据实际调整) alpha = img.getchannel("A") start_x, start_y = width // 2, height // 2 # 填充内部为白色,设置边框颜色阈值(Alpha≥200的判定为边框区域) draw.floodfill((start_x, start_y), 255, thresh=200) # 保存生成的遮罩 mask.save("mask_result.png")
如果不确定内部起始点的位置,可以通过遍历像素找到轮廓内的透明点:
# 遍历像素定位内部起始点 start_x, start_y = 0, 0 for x in range(width): for y in range(height): if alpha.getpixel((x, y)) == 0: # 检查周围是否存在不透明边框,确认该点在轮廓内部 if (alpha.getpixel((x+1, y)) >= 200 or alpha.getpixel((x-1, y)) >= 200 or alpha.getpixel((x, y+1)) >= 200 or alpha.getpixel((x, y-1)) >= 200): start_x, start_y = x, y break else: continue break
按上述方法处理后,就能得到包含圆角矩形内部所有区域的遮罩,和你需要的效果一致。
内容的提问来源于stack exchange,提问作者Ngoc Hoang
相关产品推荐
相关产品推荐

