【发布时间】:2017-05-25 09:40:57
【问题描述】:
* 编辑 * 不,我不是要转换 .BMP 只需简单地加载 PNG 并在 tk Canvas 中渲染它(透明位实际上是透明的。)
目标: 什么以透明方式加载 PNG 文件并使用 Python3 在 tkinter Canvas 中渲染它们(并使用 Pillow 支持 PIL)
问题: 当加载为 RGBA 时,它们无法在画布中呈现。将它们转换为 RGB,它们将呈现,但当然没有透明度。
环境: Mac OSX, Python 3.5 安装并验证 Pillow 在 3.5 路径中
注意事项: CuriosityRover.png 确实是一个 RGBA,打印声明证实,并通过 finder 显示灰色背景和 Photoshop 以透明度保存网页进行验证。
我试过像这样只提取 alpha 层:
alpha = img.convert('RGBA').split()[-1]
调用 alpha.show() 确实在预览 alpha 层中显示我,但它无法在画布小部件中呈现。
我还尝试使用 ImageOps.invert(alpha) 反转 alpha 层 (在应用反转后通过调用 .show() 进行验证,我在预览中看到了反向 alpha 层。)
我尝试过创建这样的矩形透明区域: 透明区域 = (0, 0, 300, 300) mask = Image.new('L', curosity.size, color=255) 绘制 = ImageDraw.Draw(蒙版) draw.rectangle(transparent_area, fill=0) img.putalpha(掩码)
确实可以创建一个透明的矩形区域,所以看起来 canvas.create_image 可以很好地处理透明度,但是不知何故,我无法创建透明度数据正确的 PhotoImage。
一天中我打开了很多堆栈溢出选项卡,我很尴尬,我无法弄清楚这一点。
这似乎是世界上最简单的事情。我做错了什么?
import tkinter as tk
from PIL import Image, ImageTk
img = Image.open("./Assets/CuriosityRover.png")
img2 = Image.open("./Assets/CuriosityRover.png").convert('RGB')
img.show() # Shows the image just fine in preview
print(img.format, img.size, img.mode)
root = tk.Tk()
photo = ImageTk.PhotoImage(img) # img fails render, img2 works but no alpha
canvas = tk.Canvas(root, width=600, height=600, bg="black")
canvas.create_image((300, 300), image=photo)
canvas.grid(row=0, column=0)
root.mainloop()
【问题讨论】:
-
不,我没有加载 .BMP,我正在加载 PNG
-
“渲染失败”是什么意思?你收到错误信息还是什么?我只能说它适用于 Linux,所以问题只能在 Mac 上。顺便说一句:你只尝试过一张图片吗?
-
感谢您在 Linux 上试用。对不起,我应该更清楚,它渲染,但它把透明部分绘制为不透明的白色。我尝试了两个不同的图像。
-
RGB 模式会渲染但不透明位,RGBA 模式不会渲染,但 RGBA 会 .show()
标签: python python-3.x tkinter png alpha