我确实比 GraphicsMagick 更了解 ImageMagick。对于 ImageMagick,以下语句适用:
我认为这对于 GraphicsMagick 是一样的,真的。
背景说明
如果您使用 来查看原始 GIF identify
,您会发现并非每个帧都具有相同的尺寸:
识别 Qb1m0.gif
Qb1m0.gif[1] GIF 720x416 720x416+0+0 8 位伪类 256c 920KB 0.000u 0:00.009
Qb1m0.gif[1] GIF 471x122 720x416+160+75 8 位伪类 256c 920KB 0.000u 0:00.009
Qb1m0.gif[2] GIF 471x121 720x416+160+76 8 位伪类 256c 920KB 0.000u 0:00.009
Qb1m0.gif[3] GIF 471x123 720x416+160+75 8 位伪类 256c 920KB 0.000u 0:00.009
Qb1m0.gif[4] GIF 471x123 720x416+160+75 8 位伪类 256c 920KB 0.000u 0:00.009
Qb1m0.gif[5] GIF 471x123 720x416+160+75 8 位伪类 256c 920KB 0.000u 0:00.009
Qb1m0.gif[6] GIF 471x123 720x416+160+75 8 位伪类 256c 920KB 0.000u 0:00.009
Qb1m0.gif[7] GIF 471x123 720x416+160+75 8 位伪类 256c 920KB 0.000u 0:00.009
Qb1m0.gif[8] GIF 471x122 720x416+160+76 8 位伪类 256c 920KB 0.000u 0:00.009
Qb1m0.gif[9] GIF 471x123 720x416+160+75 8 位伪类 256c 920KB 0.000u 0:00.009
Qb1m0.gif[10] GIF 471x123 720x416+160+75 8 位伪类 256c 920KB 0.000u 0:00.000
Qb1m0.gif[11] GIF 471x123 720x416+160+75 8 位伪类 256c 920KB 0.000u 0:00.000
Qb1m0.gif[12] GIF 471x123 720x416+160+75 8 位伪类 256c 920KB 0.000u 0:00.000
Qb1m0.gif[13] GIF 471x122 720x416+160+76 8 位伪类 256c 920KB 0.000u 0:00.000
Qb1m0.gif[14] GIF 471x123 720x416+160+75 8 位伪类 256c 920KB 0.000u 0:00.000
Qb1m0.gif[15] GIF 471x123 720x416+160+75 8 位伪类 256c 920KB 0.000u 0:00.000
这些尺寸变化是为了减小文件大小而对动画 GIF进行帧优化的结果。
还有其他优化在起作用,它们确实减少了使用的颜色数量。这两种类型的优化都不能很好地与-resize
操作结合起来。
-resize
是为单个图像设计的,并使生成的单个图像看起来尽可能好。这通常会为图像添加新的颜色值。这确实与 GIF 的设计目的相矛盾:使用严格限制的颜色表(最多 256 种颜色)。在动画序列中,下一个图像/帧-resize
可能会产生与前一个完全不同的颜色表——但对于一个工作良好的动画,您需要一个跨所有帧的通用颜色表。
-resize
将每个帧图像与其他图像完全分开处理,并且不考虑“帧优化”(它倾向于为放置在具有自己偏移量的公共画布上的每个帧创建不同的宽度+高度)。
因此,调整大小的图像远非理想地保存为单个图像的有限 GIF 文件格式,更不用说用于动画 GIF 的多帧了。结果是在调整大小的图像中大量减少了颜色。
然后是透明度问题:大多数动画 GIF 确实大量使用了透明度。透明度经常用于实现压缩优化,通常图像的外观根本不需要透明度。
在这种情况下发生的情况是:-resize
在叠加图像中创建半透明像素。当图像被保存回 GIF 文件格式时,这些像素随后被转换为完全透明或完全不透明:两者都会为生成的动画产生严重的颜色失真,远离原始颜色。
一般程序
通常,调整动画 GIF 大小的最佳程序是:
合并(去优化)动画。这将为动画的所有帧创建相同大小的单个图像。
对动画进行完整的 GIF 优化序列:不仅是帧优化,还有颜色优化。
“简单”命令
要仍然尝试运行“简单”调整大小命令,您可以试试这个:
convert \
http://i.imgur.com/Qb1m0.gif \
-coalesce \
-resize 200x200 \
cinema_200.gif
结果:
此命令将解决帧优化问题。它将纠正由此产生的问题,但会增加文件大小。
但是,当涉及到边缘时,它可能仍会显示“阶梯”伪影,因为调整大小的帧将出现可怕的锯齿。这是因为抗锯齿需要边缘周围的半透明颜色,但 GIF 无法保存-resize
操作员生成的半透明颜色。