Я пытаюсь взять GIF с палитрой, содержащей один индекс прозрачности, и использовать Pillow для создания обрезанных фрагментов изображения. Однако при использовании метода crop () результаты перестают быть прозрачными.
original = Image.open("filename.gif")
print(original.mode) # prints "P", as it should
transparent = original.info["transparency"]
print(transparent) # prints the correct index of the transparent color
cropped = original.crop((0, 0, 10, 10))
print(cropped.info) # transparency no longer present
cropped.info["transparency"] = 255
print(cropped.info) # key is entered, but not transparent in a drawn image
Как сохранить или восстановить прозрачный индекс с помощью манипуляций в Pillow? Как показано выше, даже если я «грубой силой» добавлю индекс прозрачности обратно в «информационный» словарь, это, очевидно, не то место, где Python ищет индекс для указания. В документации также упоминается, что некоторые методы, такие как crop (), ленивы и не передают всю информацию об изображении, поэтому есть ли способ повторно добавить такую информацию в объект Image? В документации говорится, что я могу сделать это, сохранив новый файл GIF, но мне не понадобятся дополнительные изображения после того, как программа завершит работу и отобразит их.
отредактирован, чтобы добавить дополнительную информацию ниже:
Исходное изображение, созданное в GIMP (красный кружок, отмечен как прозрачный с помощью IrfanView)
Результат моего кода, в котором круг становится видимым красным
Вся моя программа здесь:
from tkinter import *
from tkinter import ttk
from PIL import Image
from PIL import ImageTk
class Main:
def __init__(self):
self.root = Tk()
self.background = Canvas(self.root)
self.background.grid(column=0,row=0)
self.Draw()
def Draw(self):
original = Image.open("Transparency_test.gif")
print(original.mode) # prints "P", as it should
transparent = original.info["transparency"]
print(transparent) # prints the correct index of the transparent color
cropped = original.crop((0, 0, 50, 50))
print(cropped.info) # transparency no longer present
test_uncropped = ImageTk.PhotoImage(image=original)
test_cropped = ImageTk.PhotoImage(image=cropped)
self.background.create_image((0,0), image=test_uncropped, anchor=NW)
self.background.create_image((100,0), image=test_cropped, anchor=NW)
self.root.mainloop()
instance = Main()