python-3.x - Pillow 和 tkinter 未显示 RGBA 图像
问题描述
我正在尝试使用 Pillow 和 Tkinter 让 PNGA 图像显示在我的 UI 中。我在 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 通道会出现一个黑框。
任何帮助将不胜感激。
图片:
解决方案
我不明白您要做什么,但问题是图像中的所有信息都在 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()
请注意,您可以使用homebrew在 macOS 上轻松安装ImageMagick:
brew install imagemagick
如果您使用图像,当您在那里时,也可以获取这些包:
brew install pngcheck exiftool jhead
推荐阅读
- azure - 向所有 Application Insight 跟踪添加自定义属性
- php - 数组到 json 在 php 中显示为“数组数组”
- javascript - Kendo Grid rowTemplate k 按钮单击功能未定义
- c++ - Linux C++。在预加载的共享库中定义的基类的崩溃调用函数
- laravel - 具有多个值的 Laravel 过滤器
- mysql - 有什么方法可以以更快的方式 MySQL 加入 LIKE 列?
- c# - 如何从字符串中删除 X 个大写字母?
- ios - 无法使用 Alamofire 中的 .PUT 请求更新 API 中的数据
- python - 将 c++ 程序的结果导入 python
- typescript - 如何仅输出我的打字稿项目的 d.ts?