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

Python Pillow实现图片点击叠加效果时如何调整叠加颜色透明度以显示底层图片

Python Pillow实现图片点击叠加效果时如何调整叠加颜色透明度以显示底层图片

嗨,我来帮你搞定这个问题~ 你现在遇到的问题是因为叠加的颜色只使用了RGB三元组,没有设置透明度(Alpha通道),所以颜色会完全覆盖底层图片。Pillow的RGBA模式里,第四个数值就是控制透明度的,范围是0到255——0代表完全透明,255代表完全不透明,你可以根据需求调整这个值来实现半透明效果。

下面是修改后的完整代码,我标注了关键的修改点:

import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageDraw, ImageTk

class ImageEditor:
    def __init__(self):
        self.root = tk.Tk()
        self.image = None
        self.grid = None
        # 修改1:把颜色从RGB三元组改为RGBA四元组,第四个值是透明度(这里用128表示半透明)
        self.colors = [(255, 0, 0, 128), (255, 255, 0, 128), (0, 0, 255, 128)]  
        self.current_color_index = 0
        self.display_image = None
        self.canvas = tk.Canvas(self.root)
        self.canvas.bind("<Button-1>", self.change_color)
        self.canvas.pack(side='left')
        self.load_btn = tk.Button(self.root, text='Load', command=self.load_image)
        self.load_btn.pack(side='right')
        self.save_btn = tk.Button(self.root, text='Save', command=self.save_image)
        self.save_btn.pack(side='right')
        self.root.mainloop()

    def load_image(self):
        img_path = filedialog.askopenfilename()
        self.image = Image.open(img_path).convert("RGB")  
        self.grid = Image.new("RGBA", self.image.size, (0, 0, 0, 0))  
        self.display_image = ImageTk.PhotoImage(self.image)
        self.canvas.config(width=self.image.width, height=self.image.height)
        self.canvas.create_image(0, 0, image=self.display_image, anchor='nw')

    def change_color(self, event):
        if self.image is None:
            return
        x, y = event.x, event.y
        region = (x - 10, y - 10, x + 10, y + 10)
        draw = ImageDraw.Draw(self.grid)
        if self.current_color_index == 3:
            draw.rectangle(region, fill=(0, 0, 0, 0))
        else:
            # 修改2:直接使用RGBA颜色,自带透明度
            color = self.colors[self.current_color_index]
            draw.rectangle(region, fill=color)
        # 合成RGBA图片,保留透明度
        self.display_image = ImageTk.PhotoImage(Image.alpha_composite(self.image.convert("RGBA"), self.grid))
        self.canvas.create_image(0, 0, image=self.display_image, anchor='nw')
        self.current_color_index = (self.current_color_index + 1) % 4  

    def save_image(self):
        if self.image is None:
            return
        file_path = filedialog.asksaveasfilename(defaultextension=".png", filetypes=[("PNG File", "*.png")], initialfile="output")
        if file_path:
            final_image = Image.alpha_composite(self.image.convert("RGBA"), self.grid)
            final_image.save(file_path, "PNG")

if __name__ == "__main__":
    app = ImageEditor()

关键说明:

  1. 透明度设置:在self.colors里,每个颜色的第四个值就是透明度,比如128是半透明,你可以改成64更透明,或者192更不透明,只要在0-255之间就行。
  2. RGBA合成:Image.alpha_composite方法会正确处理两张RGBA图片的透明度叠加,所以底层图片的细节就能透过半透明的叠加层显示出来了。
  3. 清除逻辑:原来的(0,0,0,0)是完全透明的黑色,用来清除叠加层,这个逻辑是对的,不需要修改。

这样修改后,你点击鼠标叠加的颜色就会带有透明度,底层图片就能清晰显示啦~

备注:内容来源于stack exchange,提问作者pranav nerurkar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 12:44:33