有时候,我们有压缩gif的需求——例如为了优化网页加载速度。在unix环境下,可以使用ImageMagick工具。

压缩gif使用-layers方法Optimize:

convert source.gif -layers Optimize dest.gif

可惜的是,以上的命令只适用于卡通类的gif……如果你的gif是从录制的视频转化而来的,通常压缩不了多少,甚至可能比原文件更大。这是为什么呢?

Optimize

要知道这是为什么,我们先看看这个Optimize到底做了哪些事情?

Coalesce 动画

基本帧优化

透明度优化

Coalesce

gif的每一帧,有一部分元素是和前一帧相同的,因此保存的时候,每一帧通常不是完整的画面,而一个较小的区块(这个区块包括了改变的部分),这样可以压缩尺寸。

例如,上面一帧gif,背景是不变的,所以实际储存的时候,每一帧可能是这样的:

Coalesce就是将这些动画还原成完整的一帧一帧画面,方便后期的处理。

基本帧优化

Coalesce之后的图像,重新计算、生成新的帧。这个过程可以说是“螺旋式地前进”,看起来是抵消了coalesce,其实在重新计算、生成的过程中,使用的算法、参数可能比原图的更好,因此最终可以压缩体积。这就是基本帧优化。

透明度优化

gif的帧和帧之间,有很多颜色是一样的。所以,我们可以将这些颜色一致的区域视作背景,保存下一帧的时候,和背景重合的像素都保存为透明像素,这样就可以省去保存很多与背景像素一模一样的像素的色彩信息。

例如,上面的gif图像,后面的几帧,四边使用透明像素:

加大透明区域,就可以省去更多重复的色彩信息,从而进一步压缩尺寸,这就是透明度优化。

透明度优化的局限

上面说了,对于视频转化而来的gif,压缩的效果不好。原因就是透明度优化环节出了问题。

视频转化而来的gif,背景可能会有轻微的抖动,同时,视频的每一帧画面采用了有损压缩,相近的颜色会被压缩为同一种颜色,因此同样的颜色,在不同的帧里面可能会被近似成不同的颜色。这两个因素就导致透明度优化效果很差。由于透明度优化是一个非常复杂的过程,牵涉到LZW压缩算法,因此这种情况下,优化可能反而使得LZW压缩的选择变差。所以最终优化过的gif,大小就和原图差不多,甚至更大。

解决方案

一旦我们弄明白了原因,那么解决方案就很显然了:优化的时候,将相近的颜色视为相同的颜色,这样就可以抵消抖动和色彩压缩的影响。这通过设置fuzz因子来达成:

convert test.gif -fuzz 15% -layers Optimize result.gif

-fuzz选择多少能取得最大的压缩效果,同时对画质的影响可以接受,则需要耐心地尝试。

注意:以上的方案是假定你只有gif文件,但是如果你有视频原文件的话,就是另一回事了。

python gif压缩_压缩gif的正确姿势相关推荐

  1. 压缩winsxs文件夹的正确姿势

    如果你已经用完这篇Windows系统盘无痛瘦身提到的所有方法还需要进一步释放系统盘容量,那么winsxs文件夹就是最后的希望了. 首先这个文件夹是绝对不能删不能删不能删的,然后除了MS给的补丁能通过磁 ...

  2. python readfile 管道_使用win32的正确方法是什么文件.ReadFile从管道中获取输出?

    我正在使用pywin32扩展来访问Python下的win32api.我是用Python编写Windows编程的新手--我是一个POSIX的人--所以我可能是在用一种头脑简单的方式做事.在 我试图正确地 ...

  3. java bcd 压缩_压缩BCD编码的Java实现

    今天看到论坛的一个朋友问压缩BCD码的转换问题,正好下午没有事情,所以自己写了一个Java实现.首先转载一下BCD码的简单介绍. BCD(Binary Coded Decimal)是用二进制编码表示的 ...

  4. java bcd 压缩_压缩BCD编码的Java实现 | 学步园

    今天看到论坛的一个朋友问压缩BCD码的转换问题,正好下午没有事情,所以自己写了一个Java实现.首先转载一下BCD码的简单介绍. BCD(Binary Coded Decimal)是用二进制编码表示的 ...

  5. nginx 转发慢_学习Nginx的正确姿势,多图详解助你更上一层楼!(干货收藏篇)...

    本文主要帮助大家熟悉 Nginx 有哪些应用场景.Nginx 特点和架构模型以及相关流程.Nginx 定制化开发的几种模块分类. 本文将围绕如下几个部分进行讲解: Nginx 简介及特点 Nginx ...

  6. 转录组分析_转录组分析的正确姿势

    转录组分析是目前应用最广的高通量测序分析技术之一.常见设计是不同样品之间比较,寻找差异基因.标志基因.协同变化基因.差异剪接和新转录本,并进行结果可视化.功能注释和网络分析等. 转录组的测序分析也相对 ...

  7. 利用Python构建时间序列模型解决实际问题的正确姿势

    要本着应用到实际工作中目的去学时间序列分析,才能深入浅出的学会,不要纠结于理论,只听我的,我有信心说明白. 本章内容 趋势分析 序列分解 序列预测 序列分解 统计学基础铺垫 划分 时间序列按照季节性划 ...

  8. 学习 Java 的正确姿势

    2019独角兽企业重金招聘Python工程师标准>>> 关于学习 Java 的正确姿势,以下几点是网上看到的,觉得和我的想法差不多,于是分享一下.可能和时下有些人的想法大相径庭,但是 ...

  9. python读压缩文件内容_使用Python读写及压缩和解压缩文件的示例

    读写文件 首先看一个例子: f = open('thefile.txt','w') #以写方式打开, try: f.write('wokao') finally: f.close() 文件的打开方式: ...

  10. 用python做PDF本地化压缩,新增多进程

    用python做PDF压缩 虽然现在有很多成熟的工具了,但是就是想自己捣鼓一下 在网上找了一圈,发现实现方法有两种,一种是需要联网上传(TinyPNG的API)压缩的,一种是本地用python算法 这 ...

最新文章

  1. 强大的Charles的使用,强大的flutter1.9
  2. Spring Boot系列四 Spring @Value 属性注入使用总结一
  3. 【无标题】12.04 Serverless Meetup 深圳站 | Call 你来参加
  4. 小米净水器压力传感器_净水器中RO的完整形式是什么?
  5. MAC OS上将项目提交到github
  6. idea启动崩溃问题
  7. SQL语句BETWEEN
  8. 微信小程序点餐系统怎么做
  9. Linux学习笔记(尚硅谷韩顺平老师2021最新Linux教程)万字笔记
  10. NFC reader ( ISO 15693 ) NFC相关技术详解(附源代码)
  11. JSP中文乱码问题与解决方法
  12. 修改计算机ip地址cmd,有谁能告诉我怎么用cmd指令修改自己电脑的IP地址
  13. 华为大数据研发第1轮面试
  14. 阿里内网最新发布“M8”级Java面试笔记,助力金九银十
  15. 实例:用C#.NET手把手教你做微信公众号开发(19)--使用微信支付转账到微信粉丝零钱账户
  16. 212实验室日记04
  17. Unity 判断是否为预制体的根节点
  18. 【台州网络公司】浅谈网站为什么要优化?
  19. 4、线性分类: SVM, Softmax
  20. EXACT函数——检验两个数据是否一样

热门文章

  1. 在知乎上学 Python - 入门篇
  2. Windows下完成SCTP简单抓包
  3. check root android,Root Checker - Check Root
  4. 以Spring Boot的方式显示图片或下载文件到浏览器
  5. 【项目管理工具】SVN 项目版本管理工具
  6. vs.Net 2003 安装
  7. java jemalloc_jemalloc 快速上手攻略
  8. div 垂直居中的六种方法
  9. 解决qt.qpa.xcb: could not connect to display问题
  10. Mac环境下安装、配置liteide