imagemagick 压缩gif的正确姿势

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");

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值