Изображение RGBA не отображается с помощью подушки и tkinter - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь получить изображение PNGA для отображения в моем пользовательском интерфейсе с помощью Pillow и Tkinter. Я использую python 3.7.7 на macOS.

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()

Когда я пробую это с изображениями без альфа-канала, это работает. Добавление img = ImageTk.PhotoImage(img.convert("RGB")) для удаления альфа-канала приводит к появлению черного поля.

Любая помощь будет принята с благодарностью.

Изображение:

enter image description here

1 Ответ

2 голосов
/ 06 мая 2020

Я не понимаю, что вы пытаетесь сделать, но проблема в том, что вся информация в вашем изображении находится в альфа-канале (т.е. прозрачности). Я могу продемонстрировать это, разделив каналы R, G, B и A, используя ImageMagick в Терминале следующим образом, и разместив их рядом друг с другом:

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

enter image description here

Итак, красный, зеленый и синий каналы нулевые (т.е. черные), а альфа-канал имеет белый цвет там, где он прозрачен, и вы можете видеть сквозь черный цвет RGB, и это имеет черный цвет там, где он прозрачен.

Итак, что касается вашего вопроса, поскольку вся информация находится в альфа-канале, вы можете взять только альфа-канал в качестве изображения:

#!/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


Обратите внимание, что вы можете легко установить ImageMagick на macOS с homebrew :

brew install imagemagick

Если вы работаете с изображениями, пока вы там, также получите эти пакеты:

brew install pngcheck exiftool jhead
...