https://segmentfault.com/a/1190000000436384

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

压缩gif使用-layers方法Optimize

convert source.gif -layers Optimize dest.gif

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

Optimize

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

  1. Coalesce 动画
  2. 基本帧优化
  3. 透明度优化

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文件,但是如果你有视频原文件的话,就是另一回事了。

magick++,代码示例

 std::vector<Magick::Image> lstImage ,lstNewImage;Magick::readImages(&lstImage, "F:\\imagemagick\\test\\wukong.gif");const double fuzz = 8 * QuantumRange / 100;for (int i = 0; i < lstImage.size(); i++){lstImage[i].colorFuzz(fuzz);}//Magick::optimizeImageLayers(&lstNewImage, lstImage.begin(), lstImage.end());Magick::optimizeTransparency(lstImage.begin(), lstImage.end());Magick::writeImages(lstImage.begin(), lstImage.end(), "F:\\imagemagick\\test\\wukong2.gif");

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

  1. 开发函数计算的正确姿势——支持 ES6 语法和 webpack 压缩

    为什么80%的码农都做不了架构师?>>>    首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算 ...

  2. 开发函数计算的正确姿势——轻松解决大依赖部署

    前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函数计算 ...

  3. AI 玩微信跳一跳的正确姿势:跳一跳 Auto-Jump 算法详解

    作者丨安捷 & 肖泰洪 学校丨北京大学硕士生 研究方向丨计算机视觉 本文经授权转载自知乎专栏「学术兴趣小组」. 最近,微信小游戏跳一跳可以说是火遍了全国,从小孩子到大孩子仿佛每一个人都在刷跳一 ...

  4. 安卓源码AOSP下载使用的正确姿势

    安卓源码AOSP下载使用的正确姿势 从同步源码到编译完成,整个过程应至少准备200G空间. 编译时需要的内存数与编译线程数相关,博主实测比较极限的配置是4核8G,超过这个范围将触发swap交换导致编译 ...

  5. 论 做 AI 芯片的正确姿势

    https://xie.infoq.cn/article/d5ab8bea53fa8a08406fabf9d 论做 AI 芯片的正确姿势 作者:flow 2020-08-10 本文字数:14908 字 ...

  6. AI玩微信跳一跳的正确姿势:跳一跳Auto-Jump算法详解

    最近,微信小游戏跳一跳可以说是火遍了全国,从小孩子到大孩子仿佛每一个人都在刷跳一跳,作为无(zhi)所(hui)不(ban)能(zhuan)的 AI 程序员,我们在想,能不能用人工智能(AI)和计算机 ...

  7. Ubuntu创建新用户的正确姿势

    作者按:因为教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步<Ubuntu 创建新用户的正确姿势>原文地址.更欢迎来我的小站看更多原创内容:godbmw.com,进行&q ...

  8. io在Linux,在Linux进行IO的正确姿势

    原标题:在Linux进行IO的正确姿势 很多C/C++程序虽然在做网络编程, 但大多用别人封装好的库, 对底层不甚了解, 感觉 IO 操作不是很简单吗? 我敢说, 大多数人进行 IO 的姿势都不对, ...

  9. 互联网大厂内推求职的正确姿势?

    作者 | 码农唐磊 来源 | 程序猿石头(ID:tangleithu) 背景 每个人的职业生涯基本上都离不开"投简历找工作"这件事(什么,你家里有矿?当我没说),那拿着简历找工作正 ...

  10. Android获取设备状态栏status bar高度的正确姿势

    Android获取设备状态栏高度的正确姿势 正确代码方式: int height = 0;int resourceId = getApplicationContext().getResources() ...

最新文章

  1. Mac OS Sierra安装Imagick
  2. python打包不能在其他电脑打开、找不到指定模块,pyinstaller打包移植到别的电脑报错OSError: [WinError 126] 找不到指定的模块。...
  3. 央行允许银行倒闭破产,那么储户的存款怎么办?
  4. LeetCodeOJ. String to Integer (atoi)
  5. python 配置文件中密码不能是明文_配置文件中明文密码改为密文密码的方法
  6. Epic Games创始人眼中的虚拟现实
  7. java文件无法导出excel文件,【excel表格文件格式无效】java导出excel,excel打不开,报文件格式无效,怎么解决!...
  8. QProcess 使用
  9. Python编程之求字符串长度
  10. Springcloud OAuth 授权码踩坑系列(二)
  11. Python3爬取人人网(校内网)个人照片及朋友照片,并一键下载到本地~~~附源代码...
  12. python爬取苏宁易购--jsonpath方法
  13. 看华为生态大学 如何玩转人才生态?
  14. uni-app学习 组件---a链接的跳转(四)
  15. Unity 360全景图转换为天空盒子
  16. vue页面背景颜色修改
  17. Data-driven methods for solving algebra word problems论文阅读
  18. C++标准库中的数学函数
  19. java 图片写字_用java在图片上写字
  20. matlab saveas使用报错:错误使用 matlab.graphics.internal.name (line 101)

热门文章

  1. 万用表使用心得-测量不准点的地方
  2. weblogic异常之 [Security:090303]Authentication Failed: User weblogic weblogic.security.providers.authen
  3. 2022年南京医院三基考试耳鼻咽喉科学精选题及答案
  4. STM32-GPRS模块连接系统主站
  5. PHP实现添加到错题本,制作错题本的步骤、使用方式及窍门!
  6. SpringBoot实现抽奖大转盘
  7. 前端如何用AI实现证件照在线换底色
  8. 谁在制造房价泡沫:土地供应下滑 居民杠杆上升
  9. 北京市电动自行车产品目录 汇总查询
  10. gVim配色和字体选择