首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
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
V2EX  ›  Python

Python 对 gif 进行压缩

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

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

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

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

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


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