2015-10-01 1 views
0

Я пытаюсь взять GIF с палитрой, содержащей один индекс прозрачности, и использовать Подушку для создания обрезанных суб-изображений. Однако при использовании метода crop() результаты уже не являются прозрачными.Поддержание прозрачности с помощью режима палитры GIF в подушке

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 

Как я могу поддерживать или восстанавливать прозрачный индекс с помощью манипуляций в подушке? Как показано выше, даже если я «грубой силой», добавьте индекс прозрачности обратно в словарь «info», это, очевидно, не там, где Python ищет указанный индекс. В документации также упоминается, что некоторые методы, такие как crop(), ленивы и не передают всю информацию об изображении, так есть ли способ повторно добавить такую ​​информацию к объекту изображения? Документация предполагает, что я могу сделать это, сохранив новый GIF-файл, но мне не понадобятся суб-изображения после завершения работы программы и их отображения.

отредактирован, чтобы добавить ниже дополнительную информацию:

the original image Исходное изображение, сделанное в GIMP (круг красного цвета, отмечен как прозрачный цвет с помощью IrfanView)

code output Выход моего кода, с кругом возвращается к видимой красному

Моей всей программе здесь:

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

Можете ли вы разместить конкретный файл GIF, который используете? –

+0

Привет Мичиэль. Я добавил изображение и код с его выходом. Изображение создается с использованием стандартной веб-палитры из 216 цветов, в частности, той, что предоставляется GIMP. – Taugosz

ответ

1

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

cropped = original.crop((0, 0, 50, 50)) 
    cropped.load() 
    print(cropped.info) # transparency no longer present 

    copied = original.resize((50,50)) 
    copied.paste(original, (0, 0)) 
    print(copied.info) # transparency present 

    test_uncropped = ImageTk.PhotoImage(image=original) 
    test_cropped = ImageTk.PhotoImage(image=cropped) 
    test_copied = ImageTk.PhotoImage(image=copied) 

    self.background.create_image((0,0), image=test_uncropped, anchor=NW) 
    self.background.create_image((100,0), image=test_cropped, anchor=NW) 
    self.background.create_image((200,0), image=test_copied, anchor=NW) 
+0

Спасибо, Мишель! Это, безусловно, работает. Вероятно, это не самое эффективное решение, но оно остается в пределах ограничений на поддержание палитры на всем протяжении, отлично подходит для моих нужд и прекрасно оборачивается недостатками метода crop(). – Taugosz

Смежные вопросы