使用gifsicle压缩GIF图片

# 起因

使用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后就没啥效果了, 大家可以试试看

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值