在Pillow中进行图像包裹
有没有办法让一张图片不挡住另一张在它后面的图片呢?
我附上了两张代码的图片,一张是加载了一张图片的,另一张是加载了两张的。
我在用customtkinter这个应用加载多张图片时遇到了一个特定的问题。我觉得这个问题很简单,但它让我很头疼。我可以顺利加载一张图片,但当我再加载另一张图片时,似乎它会占据整个区域。即使这张图片是透明的,它还是会挡住后面的图片。
import customtkinter as ctk
from PIL import Image, ImageTk
app = ctk.CTk()
app.configure(bg="#222")
app.geometry("600x600")
grid = Image.open("grid.png")
grid_image = ImageTk.PhotoImage(grid)
grid_label = ctk.CTkLabel(app, image=grid_image, text='')
grid_label.place(x=25, y=25)
line = Image.open("line.png").rotate(45, expand=1)
line_image = ImageTk.PhotoImage(line)
line_label = ctk.CTkLabel(app, image=line_image, text='')
line_label.place(x=10, y=10)
app.mainloop()
这个问题只在一张图片放在另一张已有的图片上面时出现。这是我能把这个问题简化到的最好程度。
我尝试过 .convert('RGBA')
和 .rotate(45, fillcolor=tuple(np.mean(np.array(line_i)[0,:], axis=0).astype(int)))
,也试过使用ImageChops。
有没有其他人解决过这个问题?
1 个回答
0
你不能通过在tkinter中叠加两个PhotoImage来实现这个效果。我建议你看看pillow库里的pil.Image.blend函数,利用这个函数可以创建一个新的合成图像,使用你两个源图像。你可以用Image.blend中的alpha参数来调整图像的透明度。
下面是基本的步骤:
- 首先打开你的两个图像,将它们作为pil.Image对象
- 然后使用Image.blend来创建一个新的混合图像对象
- 把这个新对象转换成ImageTk.PhotoImage,以便在Tkinter中显示
根据你附上的图像,看起来你想把线条图像叠加在网格图像上。
如果你想要合成的图像比任意一张图像都要大,并且让两张图像部分重叠,那么最简单的方法可能是先创建一个背景颜色的图像,包含整个图形,然后把两张图像都混合到这个图像上。
希望这能帮助你解决问题。