我正在为图像重新着色,但不想重新着色透明背景

Posted

技术标签:

【中文标题】我正在为图像重新着色,但不想重新着色透明背景【英文标题】:I'm recoloring an image and I don't want to recolor the transparent background 【发布时间】:2022-01-09 15:06:33 【问题描述】:
def recoltest():
    filenamusda = filedialog.askdirectory()
    print(filenamusda)
    global entry
    string = entry.get()
    label1.configure(text=string)
    path = filenamusda + "/*png"
    for file in glob.glob(path):
        img = Image.open(file).convert("L")
        img = ImageOps.grayscale(img)
        img = ImageOps.colorize(img, black=string, white="white")
        img = img.convert("RGBA")
        text = ScrolledText(root, width=50, height=30,padx=10,pady=8)
        text.pack()

        for i in range(30):
            cb = tk.Checkbutton(text=file, bg='white', anchor='w')
            text.window_create('end', window=cb)
            text.insert('end', '\n')
        datas = img.getdata()

        newData = []
        for item in datas:
            if item[0] == 154 and item[1] == 154 and item[2] == 154:
                newData.append((255, 255, 255, 0))
                if item[0] == 175 and item[1] == 95 and item[2] == 175:
                    newData.append((255, 255, 255, 0))

如何使它只重新着色实际图像而不是透明背景?

【问题讨论】:

您可以跳过alpha通道值为0的原始图像的像素。 请确保您的问题minimalcompleterunabble。这意味着它应该包含必要的import 语句来运行它,您应该删除所有不相关的tk 内容并提供有代表性的输入图像和预期结果。谢谢你。这也意味着您将更有可能得到答案,而且可能会更快。 【参考方案1】:

您可以将getpixel 转换为r、g、b、a,然后将a 恢复为putpixel

示例代码

r, g, b, a = img.getpixel((x, y))
if (r, g, b) in [(154, 154, 154), (175, 95, 175)]:
    new_img.putpixel((x, y), (255, 255, 255, a))

【讨论】:

以上是关于我正在为图像重新着色,但不想重新着色透明背景的主要内容,如果未能解决你的问题,请参考以下文章

为 SVG 图标的透明部分着色

如何使用 PHP 设置透明度或着色背景图像?

重新填充画布擦除区域的区域

用另一个 div 填充一个 div [重复]

JLabel 面板不透明度和一般背景着色

UIbarbutton 蓝色而不是背景图片