Python 3.x RGBA图像未与枕头和tkinter一起显示

Python 3.x RGBA图像未与枕头和tkinter一起显示,python-3.x,macos,tkinter,python-imaging-library,python-3.7,Python 3.x,Macos,Tkinter,Python Imaging Library,Python 3.7,我正试图得到一个PNGA图像显示在我的UI使用枕头和Tkinter。我在macOS上使用Python3.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.Fra

我正试图得到一个PNGA图像显示在我的UI使用枕头和Tkinter。我在macOS上使用Python3.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通道会出现一个黑框

任何帮助都将不胜感激

图像:


我不明白您想做什么,但问题是您图像中的所有信息都在alpha(即透明度)通道中。我可以通过如下方式在终端中使用ImageMagick拆分R、G、B和A通道,并将它们并排放置来演示:

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

因此,红色、绿色和蓝色通道都为零(即黑色),alpha通道的透明部分为白色,可以看到RGB黑色,透明部分为黑色

因此,关于你的问题,由于所有信息都在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()


请注意,您可以使用自制在macOS上轻松安装ImageMagick

brew install imagemagick
如果您在那里处理图像,也可以获得以下软件包:

brew install pngcheck exiftool jhead

我不明白你想做什么,但问题是你图像中的所有信息都在alpha(即透明度)通道中。我可以通过如下方式在终端中使用ImageMagick拆分R、G、B和A通道,并将它们并排放置来演示:

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

因此,红色、绿色和蓝色通道都为零(即黑色),alpha通道的透明部分为白色,可以看到RGB黑色,透明部分为黑色

因此,关于你的问题,由于所有信息都在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()


请注意,您可以使用自制在macOS上轻松安装ImageMagick

brew install imagemagick
如果您在那里处理图像,也可以获得以下软件包:

brew install pngcheck exiftool jhead

实际上,当我输入
img=ImageTk.PhotoImage(img.convert(“RGB”))
行时,我得到了一个错误。你确定这是对的吗?是的,我没有错。我在macOS上使用Python 3.7.7和Pizzle 7.1.2,如果这很重要的话。是的,我认为这很重要,我在Python 3.7中运行了它,它成功了。只是为了澄清一下,图像出现了,或者黑匣子出现了?我得到了一个黑匣子。我不知道错误是什么,因为我不熟悉RGBA Images。当我输入
img=ImageTk.PhotoImage(img.convert(“RGB”)
行时,我实际上遇到了一个错误。你确定这是对的吗?是的,我没有错。我在macOS上使用Python 3.7.7和Pizzle 7.1.2,如果这很重要的话。是的,我认为这很重要,我在Python 3.7中运行了它,它成功了。只是为了澄清一下,图像出现了,或者黑匣子出现了?我得到了一个黑匣子。我不知道错误是什么,因为我不熟悉RGBA ImagesHanks——我没有意识到颜色是反转的。谢谢——我没有意识到颜色是反转的。