枕头和tkinter不会显示RGBA图像

时间:2020-05-05 17:49:46

标签: python-3.x macos tkinter python-imaging-library python-3.7

我正在尝试使用Pillow和Tkinter在我的UI中显示PNGA图像。我在macOS上使用python 3.7.7。

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

path = "path_to_image.png"
im = Image.open(path)
print(im.mode) # prints RGBA

root = tk.Tk()

root.title("Karel")

frame = tk.Frame(root)
frame.pack()
canvas = tk.Canvas(frame, bg="white", width=500, height=500)
canvas.pack()
img = Image.open(path)  # PIL solution
img = img.resize((250, 250), Image.ANTIALIAS) #The (250, 250) is (height, width)
img = ImageTk.PhotoImage(img) # convert to PhotoImage
image = canvas.create_image(150,150, image = img)

root.mainloop()

当我尝试使用没有Alpha通道的图像时,它可以工作。添加img = ImageTk.PhotoImage(img.convert("RGB"))以删除Alpha通道将出现一个黑框。

任何帮助将不胜感激。

图片:

enter image description here

1 个答案:

答案 0 :(得分:2)

我不知道您要做什么,但问题是图像中的所有信息都位于alpha(即透明度)通道中。我可以通过在终端机中使用 ImageMagick 分割R,G,B和A通道并将它们并排放置来证明这一点:

magick image.png -channel RGBA -separate -background none +smush 10  result.png

enter image description here

因此,红色,绿色和蓝色通道都为零(即黑色),而Alpha通道在透明的位置为白色,您可以看到RGB黑色,而在透明的情况下则为黑色。< / p>

因此,关于您的问题,由于所有信息都在alpha通道中,因此您可以仅将alpha通道用作图像:

#!/usr/bin/env python3

import tkinter as tk
from PIL import ImageTk, Image

root = tk.Tk()

root.title("Karel")

frame = tk.Frame(root)
frame.pack()
canvas = tk.Canvas(frame, bg="red", width=500, height=500)
canvas.pack()
path = "image.png"
img = Image.open(path).getchannel('A')   # Take just alpha channel
img = img.point(lambda a: 255-a)         # Invert black/white
img = img.resize((250, 250), Image.ANTIALIAS)
img = ImageTk.PhotoImage(img)
image = canvas.create_image(150,150, image = img)

root.mainloop()

enter image description here


请注意,您可以使用 homebrew 在MacOS上轻松安装 ImageMagick

brew install imagemagick

如果您使用的是图像,请同时获取以下软件包:

brew install pngcheck exiftool jhead