V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ALLROBOT
V2EX  ›  程序员

有啥非常优秀的 Gif 压缩优化工具?

  •  1
     
  •   ALLROBOT · 91 天前 · 1812 次点击
    这是一个创建于 91 天前的主题,其中的信息可能已经有所发展或是发生改变。

    用的 gifsicle 工具,但感觉没压缩多少(我是 4K 分辨率)

    命令 gifsicle xx.gif --optimize=3 --colors 64 --lossy=1000 -o xx.gif ,只能把 ShareX 软件输出的 38M 的 Gif 压缩到 8M😅

    请问有降低 DPI 、超强压缩无损的 gif 优化工具?

    期望 50M 压缩到 5M 以下,DPI 、彩色数、帧数可以降低到最小,求推荐比 Gifsicle 更加优秀的优化工具

    使用参数: --optimize=3 --colors 128 --lossy=1000 --optimize=3 --colors 128 --lossy=5000 --optimize=3 --colors 128 --lossy=10000

    原图 38M ,下面大小分别是 8M,5M,3M 三张图片对比

    第 1 条附言  ·  91 天前
    注:有损压缩可接受,无损压缩没法压的狠
    30 条回复    2022-04-06 12:42:59 +08:00
    kkocdko
        1
    kkocdko  
       91 天前 via Android
    最好的方案:用视频格式或者 apng ,webp 替代 gif 。

    或者用这个优化编码器:
    https://github.com/ImageOptim/gifski
    610915518
        2
    610915518  
       91 天前
    无损。。。太难了,换个编码好一些,比如 mp4
    vanton
        3
    vanton  
       91 天前
    GIFgear
    ALLROBOT
        4
    ALLROBOT  
    OP
       91 天前
    @610915518 #2 有些网站仅支持 Gif ,不支持嵌入视频的(有损优化我当然可以接受的)
    SevnChen
        5
    SevnChen  
       91 天前
    windows 试试 screentogif
    frinstioAKL
        6
    frinstioAKL  
       91 天前   ❤️ 2
    首先推荐上 ezgif 试试: https://ezgif.com

    鉴于 gif 编码的问题, 无损真的很难, 这方面我写过一个简单的技术科普博文: https://wizyoung.dogcraft.xyz/video2gif-with-high-quality. 用 ffmpeg 来精细化 hack 应该是比较好的, 先用 ffmpeg 把视频抽帧给降低 fps, 再用 ffmpeg 里面的 gif 编码参数调优
    ALLROBOT
        7
    ALLROBOT  
    OP
       91 天前
    @SevnChen @kkocdko SreenToGif 压缩优化性能不太好,它提供的 Gifski 似乎不太能很好压缩(我用的 Gifski-较低的质量和更快的编码)

    DPI 从 96 降低到 32 ,32MB 压缩成 29MB

    DPI 32 降低到 4 ,图像长宽缩小至 52%,也只是把 29MB 压成 15MB

    然后删减帧数,多余的帧数手动剪掉,最终压缩成 7MB😂

    SevnChen
        8
    SevnChen  
       91 天前
    @ALLROBOT 我之前是用神经网络压缩,印象中效果不错,这会儿手头没 windows ,你可以试一下
    iold
        9
    iold  
       91 天前 via iPhone
    screentogif 删帧
    ALLROBOT
        10
    ALLROBOT  
    OP
       91 天前
    @frinstioAKL 32MB-->速度快放 2 倍-->有损压缩 200-->图像缩小 50%-->有损压缩-->3.23MB ,效果不错

    只是每次都上传进行输出,稍微麻烦

    cmd 的话可以制成 bat 脚本快速执行压缩命令
    icyalala
        11
    icyalala  
       91 天前
    取原始视频,用 ffmpeg 直接制作 gif
    http://blog.pkh.me/p/21-high-quality-gif-with-ffmpeg.html
    ALLROBOT
        12
    ALLROBOT  
    OP
       91 天前
    @SevnChen

    就三个吧,神经网络压缩属于哪个,或者说需要自己构建并且导入到 SreenToGif ?
    ALLROBOT
        13
    ALLROBOT  
    OP
       91 天前
    @icyalala 嘿,我用的 ShareX 截屏软件,它的 Gif 截屏流程先录像然后用 FFmpeg 转换 Gif 的

    15 秒视频,结果输出 Gif 体积 30MB~100MB😅
    GeruzoniAnsasu
        14
    GeruzoniAnsasu  
       91 天前
    @ALLROBOT 其实 octree 的压缩比是最好的
    ilxv
        15
    ilxv  
       91 天前   ❤️ 1
    bandizip 那个公司,有一个专门的 GIF 工具,Honeycam ,正版也很便宜
    icyalala
        16
    icyalala  
       91 天前
    @ALLROBOT 不要用工具,直接用 ffmpeg 命令行自己改参数加 palette 看看
    ALLROBOT
        17
    ALLROBOT  
    OP
       91 天前
    @icyalala 我用 @frinstioAKL 的博客 https://wizyoung.dogcraft.xyz/video2gif-with-high-quality 抄了 FFMPEG 脚本命令,使用参数 max_colors=150, stats_mode=single, dither=sierra2, diff_mode=rectangle, new=on

    4.5MB 的 15 秒视频只能转换成 29.5MB 的 Gif

    加上 gifsicle 的参数 --optimize=3 --lossy=1000 ,29.5MB 输出为 6.58MB

    用--optimize=3 --colors 64 --lossy=500 的话,29.5MB 输出为 5.91MB
    ALLROBOT
        18
    ALLROBOT  
    OP
       91 天前
    @GeruzoniAnsasu 没找到 octree 的,能否提供网址?
    icyalala
        19
    icyalala  
       91 天前
    @ALLROBOT 不如把你的那段视频放出来,大家每个人都压压看来对比一下效果~
    1423
        20
    1423  
       91 天前
    为什么一定要用 gif ?
    推特把 gif 淘汰了,所有的 gif 都转换成 mp4 ,文件更小,效果更好
    ALLROBOT
        21
    ALLROBOT  
    OP
       90 天前 via Android
    @icyalala https://pan.baidu.com/s/1-0Ro2EUpf71poRSukwTU1Q?pwd=mbqx


    @1423 不是所有网站都支持视频嵌入并且播放的,gif 兼容性比 mp4 好
    ALLROBOT
        22
    ALLROBOT  
    OP
       90 天前 via Android
    @icyalala 6 楼发的那个网站压缩效果最好,用十楼的办法进行压缩的,60MB 最终输出为 3.2MB
    如图所示:
    icyalala
        23
    icyalala  
       90 天前
    @ALLROBOT 我试了下上面视频,拿 ffmpeg 和 gifsicle 处理一下,也能达到 ezgif.com 的体积,调整一下 max_colors 和 gifsicle 质量后能更小一些,应该没有太大差距
    ALLROBOT
        24
    ALLROBOT  
    OP
       90 天前 via Android
    @icyalala 哈罗,能分享 sh 或 bat 脚本命令吗?希望能了解如何设置命令参数达到 ezgif 压缩程度的_(:з」∠)_
    frinstioAKL
        25
    frinstioAKL  
       90 天前   ❤️ 1
    @ALLROBOT 你贴的这个视频很好压缩啊, 只用 ffmpeg 就行

    1. 先用 ffmpeg 把视频 n 倍速播放, 比如: ffmpeg -i TEST.mp4 -filter:v "setpts=0.3*PTS" TEST2.mp4
    2. 然后再用我 blog 里面的脚本:
    ```shell
    set -e

    # global filter
    fps=8
    scale=270:-1
    interpolation=lanczos

    # for palettegen
    max_colors=64 # up to 256
    reserve_transparent=on
    stats_mode=diff # chosen from [full, diff, single]

    # for paletteuse
    dither=bayer # chosen from [bayer, heckbert, floyd_steinberg, sierra2, sierra2_4a, none]
    bayer_scale=5 # [0, 5]. only works when dither=bayer. higher means more color banding but less crosshatch pattern and smaller file size
    diff_mode=rectangle # chosen from [rectangle, none]
    new=off # when stats_mode=single and new=on, each frame uses different palette

    ffmpeg -i $1 -vf "fps=$fps,scale=$scale:flags=$interpolation,split[split1][split2];[split1]palettegen=max_colors=$max_colors:reserve_transparent=$reserve_transparent:stats_mode=$stats_mode[pal];[split2][pal]paletteuse=dither=$dither:bayer_scale=$bayer_scale:diff_mode=$diff_mode:new=$new" -y $2
    ```

    sh ./gifgen.sh TEST2.mp4 TEST2.gif

    得到的 gif 只有 2.3 M, 而且还很清晰.
    https://imgur.com/dgcTLsp

    多调下参, 再结合 gifsicle 可以更小咯, 在清晰度和体积之前寻找一个平衡即可.

    如果想实现全自动化, 我觉得一个可行的思路是先肉眼调节到一个可以接受的极限画质, 再用一些图像质量评判标准(gif 的应该也有)算出类似于质量分, 然后用暴力遍历或者启发式搜索去找到一组合适的调节参数就行, 当然, 上神经网络也许也行. 只是一个想法
    frinstioAKL
        26
    frinstioAKL  
       90 天前
    @ALLROBOT “用十楼的办法进行压缩的,60MB 最终输出为 3.2MB”, 你用 gifsicle --info xxx.gif 一看就知道他的大概参数了. 分辨率, 调色板数量, 一清二楚. BTW: gif 的编码是应该进行一次升级了, 太过时了
    icyalala
        27
    icyalala  
       90 天前
    @icyalala 不断调小 scale 、max_colors 、fps 这几个关键参数,体积越小质量越差,多试几次直到质量你能接受就行,然后再继续拿 gifsicle 调。
    janus77
        28
    janus77  
       90 天前
    ulead gif animator 老牌 gif 编辑工具了。包含速度、帧的插入 删除 编辑等等、颜色位深,也可以一键优化。
    mdgwmt0
        29
    mdgwmt0  
       90 天前
    搞什么幺蛾子
    ALLROBOT
        30
    ALLROBOT  
    OP
       90 天前
    @frinstioAKL @icyalala 非常感谢指导,用命令写了 sh 脚本,下次截图方便输出超小体积的 Gif 了,不用到 SreenToGif 特意剪辑了👍

    ```
    set -e

    # global filter
    fps=8
    scale=270:-1
    scale_=270
    interpolation=lanczos

    # for palettegen
    max_colors=64 # up to 256
    reserve_transparent=on
    stats_mode=diff # chosen from [full, diff, single]

    # for paletteuse
    dither=sierra2 # chosen from [bayer, heckbert, floyd_steinberg, sierra2, sierra2_4a, none]
    bayer_scale=5 # [0, 5]. only works when dither=bayer. higher means more color banding but less crosshatch pattern and smaller file size
    diff_mode=rectangle # chosen from [rectangle, none]
    new=on # when stats_mode=single and new=on, each frame uses different palette

    time=$(date +"%Y-%m-%d--%H-%M-%S")

    ffmpeg -i $1 -vf "fps=$fps,scale=$scale:flags=$interpolation,split[split1][split2];[split1]palettegen=max_colors=$max_colors:reserve_transparent=$reserve_transparent:stats_mode=$stats_mode[pal];[split2][pal]paletteuse=dither=$dither:bayer_scale=$bayer_scale:diff_mode=$diff_mode:new=$new" -y new_mp4_temp.gif

    # --optimize 优化等级[1,2,3] --lossy=有损优化等级[0~无穷]
    gifsicle new_mp4_temp.gif --optimize=3 --lossy=100 -o net_output_temp.gif

    mv net_output_temp.gif $time\_fps=$fps\_scale=$scale_\_max_colors=$max_colors.gif
    ```

    关于#26 ,Gif 之父前不久过世了,我不大清楚有啥团队能继续优化 Gif 编码了

    @janus77 @ilxv 感谢推荐软件

    @mdgwmt0 想表达什么?有话可以直接说出来...
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3130 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 1477ms · UTC 10:33 · PVG 18:33 · LAX 03:33 · JFK 06:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.