注意下载好库
注意文件的输入和输出方向
一、将视频转换为GIF动图
import imageio
def video_to_gif(input_video_path, output_gif_path, fps=10):
"""
将视频转换为GIF动图。
:param input_video_path: 输入视频文件的路径。
:param output_gif_path: 输出GIF动图的路径。
:param fps: 输出GIF的帧率,默认为10。
"""
# 读取视频文件
with imageio.get_reader(input_video_path, 'ffmpeg') as reader:
# 获取视频的第一帧以确定尺寸
first_frame = reader.get_next_data()
frame_count = reader.count_frames()
# 初始化一个Writer对象用于创建GIF
writer = imageio.get_writer(output_gif_path, mode='I', fps=fps)
print(f"开始转换,视频总帧数:{
frame_count}")
for i in range(frame_count):
if i < frame_count: # 添加检查条件
# 逐帧读取并写入GIF
frame = reader.get_next_data()
writer.append_data(frame)
print("转换完成")
writer.close()
# 使用示例
video_to_gif('xx.mp4', 'output.gif')
二、GIF压缩
from PIL import Image
import os
def compress_gif(input_path, output_path, resize_factor=0.5, colors=64):
img = Image.open(input_path)
frames = []
# 减少帧数
frame_indices = list(range(0, img.n_frames, 2)) # 只保留每两帧中的第一帧
for index in frame_indices:
img.seek(index)
new_frame = img.resize((int(img.width * resize_factor), int(img.height * resize_factor)),
resample=Image.LANCZOS)
new_frame = new_frame.convert("P", palette=Image.ADAPTIVE, colors=colors)
frames.append(new_frame)
# 获取循环次数,如果没有则默认为无限循环
loop_info = img.info.get('loop', 0)
# 保存为新的GIF
frames[0].save(output_path, save_all=True, append_images=frames[1:], optimize=True, duration=img.info['duration'],
loop=loop_info)
input_path = 'output.gif'
output_path = 'pt.gif'
compress_gif(input_path, output_path)