python gif压缩_压缩gif的正确姿势
有时候,我们有压缩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的正确姿势相关推荐
- 压缩winsxs文件夹的正确姿势
如果你已经用完这篇Windows系统盘无痛瘦身提到的所有方法还需要进一步释放系统盘容量,那么winsxs文件夹就是最后的希望了. 首先这个文件夹是绝对不能删不能删不能删的,然后除了MS给的补丁能通过磁 ...
- python readfile 管道_使用win32的正确方法是什么文件.ReadFile从管道中获取输出?
我正在使用pywin32扩展来访问Python下的win32api.我是用Python编写Windows编程的新手--我是一个POSIX的人--所以我可能是在用一种头脑简单的方式做事.在 我试图正确地 ...
- java bcd 压缩_压缩BCD编码的Java实现
今天看到论坛的一个朋友问压缩BCD码的转换问题,正好下午没有事情,所以自己写了一个Java实现.首先转载一下BCD码的简单介绍. BCD(Binary Coded Decimal)是用二进制编码表示的 ...
- java bcd 压缩_压缩BCD编码的Java实现 | 学步园
今天看到论坛的一个朋友问压缩BCD码的转换问题,正好下午没有事情,所以自己写了一个Java实现.首先转载一下BCD码的简单介绍. BCD(Binary Coded Decimal)是用二进制编码表示的 ...
- nginx 转发慢_学习Nginx的正确姿势,多图详解助你更上一层楼!(干货收藏篇)...
本文主要帮助大家熟悉 Nginx 有哪些应用场景.Nginx 特点和架构模型以及相关流程.Nginx 定制化开发的几种模块分类. 本文将围绕如下几个部分进行讲解: Nginx 简介及特点 Nginx ...
- 转录组分析_转录组分析的正确姿势
转录组分析是目前应用最广的高通量测序分析技术之一.常见设计是不同样品之间比较,寻找差异基因.标志基因.协同变化基因.差异剪接和新转录本,并进行结果可视化.功能注释和网络分析等. 转录组的测序分析也相对 ...
- 利用Python构建时间序列模型解决实际问题的正确姿势
要本着应用到实际工作中目的去学时间序列分析,才能深入浅出的学会,不要纠结于理论,只听我的,我有信心说明白. 本章内容 趋势分析 序列分解 序列预测 序列分解 统计学基础铺垫 划分 时间序列按照季节性划 ...
- 学习 Java 的正确姿势
2019独角兽企业重金招聘Python工程师标准>>> 关于学习 Java 的正确姿势,以下几点是网上看到的,觉得和我的想法差不多,于是分享一下.可能和时下有些人的想法大相径庭,但是 ...
- python读压缩文件内容_使用Python读写及压缩和解压缩文件的示例
读写文件 首先看一个例子: f = open('thefile.txt','w') #以写方式打开, try: f.write('wokao') finally: f.close() 文件的打开方式: ...
- 用python做PDF本地化压缩,新增多进程
用python做PDF压缩 虽然现在有很多成熟的工具了,但是就是想自己捣鼓一下 在网上找了一圈,发现实现方法有两种,一种是需要联网上传(TinyPNG的API)压缩的,一种是本地用python算法 这 ...
最新文章
- 强大的Charles的使用,强大的flutter1.9
- Spring Boot系列四 Spring @Value 属性注入使用总结一
- 【无标题】12.04 Serverless Meetup 深圳站 | Call 你来参加
- 小米净水器压力传感器_净水器中RO的完整形式是什么?
- MAC OS上将项目提交到github
- idea启动崩溃问题
- SQL语句BETWEEN
- 微信小程序点餐系统怎么做
- Linux学习笔记(尚硅谷韩顺平老师2021最新Linux教程)万字笔记
- NFC reader ( ISO 15693 ) NFC相关技术详解(附源代码)
- JSP中文乱码问题与解决方法
- 修改计算机ip地址cmd,有谁能告诉我怎么用cmd指令修改自己电脑的IP地址
- 华为大数据研发第1轮面试
- 阿里内网最新发布“M8”级Java面试笔记,助力金九银十
- 实例:用C#.NET手把手教你做微信公众号开发(19)--使用微信支付转账到微信粉丝零钱账户
- 212实验室日记04
- Unity 判断是否为预制体的根节点
- 【台州网络公司】浅谈网站为什么要优化?
- 4、线性分类: SVM, Softmax
- EXACT函数——检验两个数据是否一样