动态图像的透明度(Python3/Tkinter)

2024-05-15 01:16:37 发布

您现在位置:Python中文网/ 问答频道 /正文

使用Python和kinter。我想显示这样的内容,在覆盖层后面显示一个特定的令牌:

overlaytokencombined

(这是覆盖,后面是令牌,最后是令牌上的覆盖。标记可能不总是居中(尽管在覆盖层后面)

问题是我需要动态地创建这些图像。我不能使用预定义的图像.png.gif图像。尤其是,这些图像的颜色会频繁地变化,而我并不是事先就知道的。在

我看到的在画布上创建图像的所有示例代码都假设您正在加载一个.gif或{},类似于:

token_image = tk.PhotoImage(file="token.png")
canvas = tk.Canvas(width=500, height=500, background="black")
canvas.pack()
token = canvas.create_image((50,50), image=token_image)

但是有没有一种方法可以动态地生成令牌图像?你会如何创造不规则的形状显示在覆盖,与圆形“咬”了它?在

谢谢。在


Tags: 标记图像imagetoken示例内容png颜色
1条回答
网友
1楼 · 发布于 2024-05-15 01:16:37

作为一个基本的例子:

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

class App(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.title("Dynamic Image Test")

        tk.Label(self, text="Overlay").grid(column=1, row=1, sticky="nesw")
        tk.Label(self, text="Token").grid(column=2, row=1, sticky="nesw")
        tk.Label(self, text="Combined").grid(column=3, row=1, sticky="nesw")


        self.label_1 = tk.Label(self)
        self.label_1.grid(column=1, row=2, sticky="nesw")
        self.label_2 = tk.Label(self)
        self.label_2.grid(column=2, row=2, sticky="nesw")
        self.label_3 = tk.Label(self)
        self.label_3.grid(column=3, row=2, sticky="nesw")

        self.images = [None, None, None]
        self.photos = [None, None, None]

        self.show_changes()

    def overlay(self):
        im = Image.new("RGBA", (100,100), (255,255,0,255))
        draw = ImageDraw.Draw(im)
        draw.ellipse((10,10,90,90),fill=(0,0,0,0))
        return im

    def token(self):
        im = Image.new("RGBA", (100,100), (0,0,0,0))
        draw = ImageDraw.Draw(im)
        draw.ellipse((0,0,100,100),fill=(0,0,255,255))
        draw.line((15,15,85,85),fill=(255,0,0,255), width=5)
        draw.line((15,85,85,15),fill=(255,0,0,255), width=5)
        return im

    def combine(self, overlay, token):
        return Image.alpha_composite(token, overlay)

    def show_changes(self):
        self.images[0] = self.overlay()
        self.photos[0] = ImageTk.PhotoImage(self.images[0])
        self.label_1.configure(image=self.photos[0])

        self.images[1] = self.token()
        self.photos[1] = ImageTk.PhotoImage(self.images[1])
        self.label_2.configure(image=self.photos[1])

        self.images[2] = self.combine(self.images[0], self.images[1])
        self.photos[2] = ImageTk.PhotoImage(self.images[2])
        self.label_3.configure(image=self.photos[2])

if __name__ == "__main__":
    app = App()
    app.mainloop()

我本打算做一个更完整的例子,允许在飞行中改变颜色,但我要诚实地说,我不能被打扰。在

ImageDraw模块允许您对图像、绘制线条、矩形椭圆等进行基本操作,还支持RGBA格式的工作(即透明度) 所以颜色元组的形式是(红、绿、蓝、阿尔法),所有值的范围都是0-255,255表示alpha通道中完全不透明。在

希望这能告诉你你需要去哪里做你想做的事情。在

相关问题 更多 >

    热门问题