如何使用ImageMagick裁剪动态gif图像?

83

有很多关于裁剪图片的信息,但尝试裁剪(或修剪)动画会产生奇怪的结果。有时它们会闪烁,或带有额外的帧数,或一些帧正确裁剪,而其他帧则偏移。我如何防止所有这些情况发生?

4个回答

103
convert input.gif -coalesce -repage 0x0 -crop WxH+X+Y +repage output.gif
  • 动画gif通常被优化以节省空间,但是imagemagick在应用裁剪命令时似乎没有考虑这一点,并将每个帧单独处理。-coalesce重新构建完整的帧。
  • 其他命令将考虑原始gif中提供的偏移信息,因此您需要使用-repage 0x0强制重置它。
  • 裁剪本身很简单,分别提供宽度、高度、x偏移和y偏移。例如,一个40宽30高的裁剪,在50的x偏移处= 40x30+50+0。
  • 裁剪不会删除从图像中截取的画布。在裁剪后应用+repage可以完成此操作。

该命令输出一系列带有“-0”、“-1”、“-2”等附加后缀的单独文件,而不是像output.gif那样的单个文件。 - Chris Harrison
对我来说运行良好。非常感谢! - musiKk
1
“+repage” 确实对我起到了功效,谢谢!由于某种原因,ImageMagick 只为动画 .gifs 留下了画布(.png 或 .jpeg 不会出现这种情况)。 - Abe Voelker
3
这比使用Gifsicle慢,而且从我的600kB文件生成16MB文件。 - Dusan Plavak
顺便说一下,如果你不理解宽度、高度、x偏移和y偏移,可以这样想: x偏移和y偏移是裁剪开始的位置,而宽度和高度则是裁剪的范围。 - Paul Chris Jones

44
即使使用了coalesce和repage,我仍然无法很好地裁剪和调整大小动画gif。我发现一个名为Gifsicle的程序,它非常适合处理动画gif。
gifsicle --crop 0,0-100,100 --output out.gif in.gif

它还可以执行各种其他操作。来试试吧!


这对于保持文件大小很有帮助。ImageMagick在我的使用情况下将大小增加了3.7倍。 - Wesley Baugh
5
前两个数字是左上角的像素坐标,另外两个数字是你想裁剪的区域的右下角坐标。 - Mijo
2
你可以使用 --crop X1,Y1-X2,Y2 来输入要剪裁的右上角和左下角坐标,或者使用 --crop X1,Y1+WxH 来指定所需区域的宽度和高度。 - Jezzamon

6

动画通常会被优化,这意味着某些帧比其他帧小。因此,在使用ImageMagick进行裁剪之前,您可能需要合并动画。

convert in_animation.gif -coalesce -crop WxH+X+Y +repage -layers optimize out_animation.gif

您可能需要在读取输入动画之前添加一个 -dispose 方法,以避免闪烁。如果您想要进行更改,则也需要在末尾设置 -delay 和 -loop。请参见以下链接: http://www.imagemagick.org/Usage/anim_basics/#dispose http://www.imagemagick.org/Usage/anim_basics/#coalesce http://www.imagemagick.org/script/command-line-options.php#layers

2
以下代码在我的Mac电脑上运行成功。
convert -dispose 2 input.gif -trim -layers TrimBounds animation.gif

这里是源代码


1
这是最终对我起作用的方法。我花了半个小时左右试图弄清楚如何自动修剪我的gif文件中的空白空间,而这个答案就是解决方法。对于未来和我一样的人们,如果文件格式正确,convert $input -trim -layers trim-bounds $output正好可以满足你的需求。在这种情况下,+repage选项可能看起来像是正确的选择,但我向你保证它并不是。 - PrincessRTFM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接