V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
lihsen
V2EX  ›  Python

Python 对 gif 进行压缩

  •  
  •   lihsen · 2017-07-12 11:33:41 +08:00 · 9489 次点击
    这是一个创建于 2698 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,如何对gif进行压缩。

    我一开始想到的办法是利用pillowgif中的每一帧的取出来,对单帧图片进行压缩后,再调用方法将压缩后的保存回去,但是最后得到的gif没有变小,反而变大了。

    后来我对单帧图片保存为pnggif格式,明显gif格式比png格式的大小要大多了,对图像编码这一块不是很了解,有知道原因的吗?或者有知道别的对gif进行压缩的办法。。。

    25 条回复    2018-08-01 20:53:51 +08:00
    ivechan
        1
    ivechan  
       2017-07-12 12:23:25 +08:00
    GIF 压缩一般是跳过某些帧吧,比如 60 帧的你取 20 帧。
    GIF 一般都已经被压缩了, 你单帧取出来再压缩也没有什么意义。
    baichi
        2
    baichi  
       2017-07-12 13:16:05 +08:00
    第 N+1 帧把第 N 帧重复的像素去掉(变成透明)试试
    dylanninin
        3
    dylanninin  
       2017-07-12 13:32:56 +08:00 via iPhone   ❤️ 1
    XiaoFaye
        4
    XiaoFaye  
       2017-07-12 14:29:36 +08:00
    等全球网络都是万兆连接的时候这个估计就没什么意义了。
    lihsen
        5
    lihsen  
    OP
       2017-07-12 18:09:18 +08:00
    @ivechan 现在问题就是,我单帧取出来之后,压缩过后单帧是变小了的,为什么最后整成**gif**的时候整个**gif**就变大了
    tumbzzc
        6
    tumbzzc  
       2017-07-12 18:17:17 +08:00
    ffpmeg 不是更好吗
    gnaggnoyil
        7
    gnaggnoyil  
       2017-07-12 19:50:28 +08:00
    GIF 单帧的存储方法都是固定的,你怎么还能把压缩过的单帧图片原封不动地扔进 GIF 容器里去?
    awanabe
        8
    awanabe  
       2017-07-12 19:54:36 +08:00 via iPad
    imageio 试试
    lihsen
        9
    lihsen  
    OP
       2017-07-12 23:45:14 +08:00
    @tumbzzc 没用过这个,想先看一下能不能自己实现
    lihsen
        10
    lihsen  
    OP
       2017-07-12 23:47:09 +08:00
    @gnaggnoyil GIF 单帧的存储方法是怎样的,我不是很了解这个,能不能再说详细点
    lihsen
        11
    lihsen  
    OP
       2017-07-12 23:50:29 +08:00
    @awanabe 试过了,我先是将每一帧取出来保存为 png 格式,然后利用 imageio 将所有的帧整合保存到一起,最后生成的 GIF 的大小还是比所有 png 格式的帧的大小要大
    gnaggnoyil
        12
    gnaggnoyil  
       2017-07-13 00:28:18 +08:00
    @lihsen 固定的调色板+LZ77,管你源是 PNG 还是 JPEG
    lxy
        13
    lxy  
       2017-07-13 00:37:33 +08:00
    NoAnyLove
        14
    NoAnyLove  
       2017-07-13 01:23:13 +08:00
    根据使用工具的经验来看,压缩 GIF 主要是调整调色板、减少颜色,以及最重要的只保留变动的部分。感觉逐帧保存会不会破坏这个?
    oglop
        15
    oglop  
       2017-07-13 04:03:27 +08:00 via Android
    可以用 ffmpeg 或者是 gifsicle
    kxxoling
        17
    kxxoling  
       2017-07-13 04:16:13 +08:00 via iPad
    试试 wand
    hsmocc
        18
    hsmocc  
       2017-07-13 07:14:48 +08:00 via iPhone
    @lihsen 以前看网络时候,书上好像说当前帧是 f1,下一帧 f2 的得到可能是 f1 加上相对于 f1 的变化,当 f2 和 f1 的差异非常小时这个变化量就非常小
    est
        19
    est  
       2017-07-13 09:15:48 +08:00
    https://en.wikipedia.org/wiki/Motion_JPEG

    It is natively supported by the QuickTime Player, the PlayStation console, and web browsers such as Safari, Google Chrome, Mozilla Firefox and Microsoft Edge.


    我想问为啥大家不用这个。。
    zhuangtongfa
        20
    zhuangtongfa  
       2017-07-13 09:49:12 +08:00
    ffmpeg
    Thiece
        21
    Thiece  
       2017-07-13 17:13:42 +08:00
    可以参考一下 jayxon 的这篇答案 https://www.zhihu.com/question/27201109/answer/146046671
    Thiece
        22
    Thiece  
       2017-07-13 17:16:48 +08:00
    我对 GIF 没有深入的研究过,以下内容仅为猜测;是否是类似视频的 B,I,P 帧呢?在源文件时 GIF 把前后帧相同的区块共用了,但是单独拆帧压缩让前后帧的相同区块破坏掉了。
    lihsen
        23
    lihsen  
    OP
       2017-07-14 22:12:21 +08:00 via iPhone
    花了几天没找到很好的解决办法,压缩必定是要牺牲一些的,要么减少帧数,要么对每帧进行一些重复的区域的处理,第二种方案还没有时间试过。在用 pillow 提取帧再组合帧的时候,发现每一帧上多出了个 local color table,感觉是这个增加了大小,但是还没找到办法去除掉。。。
    lihsen
        24
    lihsen  
    OP
       2017-07-14 22:14:19 +08:00 via iPhone
    @lxy 文章讲得挺好的,提供了很多思路
    zouchtssn
        25
    zouchtssn  
       2018-08-01 20:53:51 +08:00
    不知道是否会挖坟,不过调用 gifsicle 来进行优化得到的结果还不错。
    可以将依赖的二进制文件一并放在工程中。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   891 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 21:28 · PVG 05:28 · LAX 13:28 · JFK 16:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.