# 起因
使用python的moviepy库将视频剪切成了很多小片段, 然后转成GIF后发现GIF图片很大, 看了文档说这个库不支持修改GIF的色深, 如果只修改fps值的话, 出来的图片内容是加速的
# 命令行使用gifsicle
这个软件是免安装的, 官网: Gifsicle: Command-Line Animated GIFs (lcdf.org)
下载后要在命令行执行命令, 解压后文件夹里有使用说明
举一个例子:
PS D:\gifsicle> .\gifsicle.exe -b -O2 --colors=128 D:/gif/1.gif
-b: --batch 的缩写, 意思是修改完gif不再生成新文件, 而是覆盖原来的文件, 必须要在最开始使用
-o: --output 的缩写, 指定输出的文件地址, 不能和-b命令同时使用
-O2: 优化方法, 一共有三种: O1: 只存储有变化的部分数据 O2: 在O1的基础上使用透明 O3:使用多种方法(更慢,更好,官方说有可能比之前的视频文件还要大)
--colors=128 指定图片的色深, 128/256...值越小压缩越厉害, 当然文件也会变糊一些
--lossy=30 改变图像颜色以缩小输出文件大小,但代价是产生伪影和噪点, 默认是20, 值越大压缩越厉害 (这里我没有用, 因为--colors的压缩力度已经很大了)
# 配合python使用
因为是批量处理, 命令行写bash脚本太麻烦, 就使用python的subprocess库来实现了
def shrink_gif(file):
subprocess.run(["D:/gifsicle/gifsicle.exe", "-b", "-O2", "--lossy=40", "--colors=128", file])
读取文件列表后, 循环调用上边方法即可. 注意参数顺序.
# 另附完整代码
from moviepy.editor import VideoFileClip
import os
import math
import subprocess
def mp4_to_gif(src_file, target_file):
# 使用VideoFileClip加载MP4文件
video_clip = VideoFileClip(src_file)
# 调整视频的尺寸,如果需要的话
video_size_w = math.ceil(video_clip.size[0] / 2)
video_size_h = math.ceil(video_clip.size[1] / 2)
video_clip = video_clip.resize((video_size_w, video_size_h))
# 将视频转换为GIF
video_clip.write_gif(target_file, fps=10) # 设置帧率,可以根据需要调整
# 关闭视频剪辑对象
video_clip.close()
def shrink_gif(file):
#subprocess.run(["D:/gifsicle/gifsicle.exe", "-b", "-O2", "--lossy=40", "--colors=256", file])
subprocess.run(["D:/gifsicle/gifsicle.exe", "-b", "-O2", "--lossy=100", file])
original_folder = 'D:/BaiduNetdiskDownload/lanqiu/maidi/20020308/'
target_folder = original_folder + 'gif/'
for filename in os.listdir(original_folder):
# 检查文件名是否包含旧字符串
if '.mp4' in filename:
src_filepath = os.path.join(original_folder, filename)
target_filepath = os.path.join(target_folder, filename.replace('mp4', 'gif'))
print(src_filepath)
mp4_to_gif(src_filepath, target_filepath) # 将mp4转为gif
shrink_gif(target_filepath) # 压缩gif
#break
print("All files done.")
备注:
①改变图片尺寸后, 对图片的压缩也很厉害, 而且图片也还清晰
② 使用--lossy时, 我实验的值超过100后就没啥效果了, 大家可以试试看