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

如何从透明图片创建包含圆角矩形内部像素的黑色遮罩?

解决方案

问题出在convert("L")会丢弃Alpha通道信息,只依据RGB值生成灰度图,导致透明的圆角矩形内部区域被处理成黑色。要生成包含内部所有像素的遮罩,得利用Alpha通道定位形状轮廓,再填充内部区域:

  1. 读取原图并提取Alpha通道,以此定位圆角矩形的轮廓范围
  2. 用填充工具将轮廓内部全部设为白色
  3. 最终生成内部全白、外部全黑的遮罩图

以下是具体实现代码:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:33:16