LINUX.ORG.RU

Загрузка фреймов Gif картинки (проблемка)

 , , , ,


0

1

Всех приветствую!

Есть небольшой набросок программы:

загружает gif-изображение, по кнопке [Next frame] смешивает текущий PIL.Image со следующим фреймом,

т.е. последовательно нажимая на [Next frame] видим анимацию gif.

В верхний label выводится результирующее изображение, в нижний - текущий фрейм.

Проблема в том что PIL.Image.open() ленивая операция и у меня кроме нулевого фрейма другие фреймы не загружаются.

Как исправить?

import tkinter as tk
from PIL import Image, ImageTk, ImageSequence

root = tk.Tk()
#frames = [tk.PhotoImage(file="pic.gif", format="gif -index %i" %(i)) for i in range(39)]
img = Image.open("pic.gif")
frames = [frame for frame in ImageSequence.Iterator(img)]
ind=0
combined_img=frames[ind]

combined_img_tk = ImageTk.PhotoImage(combined_img)
label1=tk.Label(root, image=combined_img_tk)
label1.image = combined_img_tk

label2=tk.Label(root, text = 'Reserved label')

def next_frame():
    global ind
    global label1
    global label2
    global frames
    global combined_img
    frame = frames[ind]
    ind += 1
    if ind>38:
        ind=0
    print(ind)
                 
    img2=frames[ind]
    img2_tk = ImageTk.PhotoImage(img2)
    label2.configure(image=img2_tk)
    label2.image = img2_tk
    
    combined_img.paste(img2, (20, 20), img2) #смещение чтобы было видно что накладывается
    
    combined_img_tk = ImageTk.PhotoImage(combined_img)
    label1.configure(image=combined_img_tk)
    label1.image = combined_img_tk

root.title("Simple Gif View - 1")
root.geometry("640x700")


tk.Button(root, text="Quit", command=root.destroy).pack()


label1.pack()
label2.pack()


    
tk.Button(root, text="Next frame", command=next_frame).pack(side=tk.BOTTOM)

root.mainloop()

PS pic.gif открыта в редакторе и определено, что содержит 39 фреймов

Буду рад любым замечаниям и советам по исправлению, написанию и организации кода (кроме завертывания в классы - не оч. это нравится)



Последнее исправление: Gyros (всего исправлений: 3)

у tk.photo для Gif есть опция -index для доступа к отдельным кадрам. Без неё «Tk normally only accesses the first image»

не знаю PIL,но раз уж он такой ленивый, то вполне могло получиться что внутри питона img2 содержит несколько фреймов (то есть оно ссылка на полный GIF и конкретный фрейм) :-) возможно стоит добавить опцию -index ind внутри процедуры next_frame

MKuznetsov ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.