from PIL import Image, ImageTk
import tkinter as tk
from tkinter import filedialog
from tkinter import Scale
class GIFPlayer:
def __init__(self):
self.root = tk.Tk()
self.root.title("GIF Player")
# 图像框
self.image_frame = tk.Frame(self.root)
self.image_frame.place(x=150, y=80, width=800, height=600)
self.image_label = tk.Label(self.image_frame)
self.image_label.pack()
# 播放按钮
self.play_button = tk.Button(self.root, text="Play", command=self.play_gif)
self.play_button.place(x=100, y=0, width=100, height=50)
# 保存按钮
self.save_button = tk.Button(self.root, text="Save as GIF", command=self.save_gif)
self.save_button.place(x=200, y=0, width=100, height=50)
# 打开图像按钮
self.open_button = tk.Button(self.root, text="Open Images", command=self.open_images)
self.open_button.place(x=0, y=0, width=100, height=50)
# 列表框
self.listbox = tk.Listbox(self.root, selectmode=tk.MULTIPLE)
self.listbox.place(x=0, y=100, width=100, height=200)
# 播放速度滑块
self.speed_scale = Scale(self.root, from_=10, to=500, orient=tk.HORIZONTAL, label="播放速度(毫秒)")
self.speed_scale.set(100)
self.speed_scale.place(x=300, y=0, width=200, height=50)
self.image_paths = []
self.images = []
self.current_frame_index = 0
self.delay = self.speed_scale.get()
def open_images(self):
file_paths = filedialog.askopenfilenames(filetypes=[("Image files", "*.png;*.jpg;*.jpeg")])
for path in file_paths:
self.image_paths.append(path)
im = Image.open(path)
self.images.append(im)
self.listbox.insert(tk.END, path)
def play_gif(self):
if self.images:
img = ImageTk.PhotoImage(self.images[self.current_frame_index])
self.image_label.config(image=img)
self.image_label.image = img
self.current_frame_index = (self.current_frame_index + 1) % len(self.images)
self.delay = self.speed_scale.get()
self.root.after(self.delay, self.play_gif)
def save_gif(self):
selected_indices = self.listbox.curselection()
if selected_indices:
selected_images = [self.images[i] for i in selected_indices]
if selected_images:
file_path = filedialog.asksaveasfilename(defaultextension=".gif", filetypes=[("GIF files", "*.gif")])
if file_path:
# 创建一个新的图像对象列表,每个图像重复多次以实现无限循环效果
repeated_images = []
for img in selected_images:
for _ in range(1): # 增加重复次数以增强无限循环的感觉
repeated_images.append(img.copy())
first_image = repeated_images[0]
first_image.save(file_path, save_all=True, append_images=repeated_images[1:], optimize=False, duration=self.delay, loop=0) # 设置 loop=0 实现无限循环
if __name__ == "__main__":
player = GIFPlayer()
player.root.mainloop()
python语言gif动画制作程序代码QZQ
于 2024-09-21 16:32:35 首次发布
1244

被折叠的 条评论
为什么被折叠?



