如何修剪动画gif(使用imagemagick)?

时间:2017-06-14 22:38:17

标签: image-processing imagemagick crop animated-gif imagemagick-convert

给出一个纯色背景上的GIF动画

animated bunny with padding

我想修剪远离填充。具体来说,我想在所有帧上将图像裁剪到前景对象的最大范围:

animated bunny without padding

我无法通过单个-alpha命令找到-backgroundconvert的正确组合来实现此目的。例如,如果我发出

convert -dispose 2 input.gif -trim -layers TrimBounds fail.gif

我得随机"背景" 单个修剪范围小于所有帧的最大范围的帧的颜色:

animated bunny with bad background colors

我可以使用一长串命令来实现正确的输出:

convert input.gif -trim -layers TrimBounds out-%03d.miff
mogrify -background "rgb(20%,30%,80%)" -layers flatten out-*.miff
convert out-*.miff output.gif
rm out-*.miff

这很慢,写了一堆临时文件,并要求我明确知道背景颜色("rgb(20%,30%,80%)")。

是否有更简单的方法来修剪GIF动画?

related question考虑​​显式裁剪而不是自动裁剪。

3 个答案:

答案 0 :(得分:2)

这是一个有趣的问题。目前,我没有看到如何改进它,因此不需要额外的文件。但我会进一步考虑。但是我可以稍微清理你的代码并让你更容易,并使output.gif看起来正确。

bgcolor=`convert oHBWq.gif[0] -format "%[pixel:u.p{0,0}]" info:`
convert oHBWq.gif -trim -layers TrimBounds out-%03d.miff
mogrify -background "$bgcolor" -layers flatten out-*.miff
convert -dispose previous -delay 10 out-*.miff -loop 0 output.gif
rm out-*.miff

enter image description here

这与上面的内容相同,但只需要保存1个多帧miff文件。子shell循环处理与你的mogrify类似。

bgcolor=`convert oHBWq.gif[0] -format "%[pixel:u.p{0,0}]" info:`
num=`convert oHBWq.gif -format "%n\n" info: | head -n 1`
convert oHBWq.gif -trim -layers TrimBounds tmp.miff
(for ((i=0; i<num; i++)); do
convert tmp.miff[$i] -background "$bgcolor" -layers flatten miff:-
done ) |\
convert -dispose previous -delay 10 - -loop 0 output2.gif
rm tmp.miff

这也可以在不必保存任何临时文件的情况下工作,但是必须为每个循环迭代重复-trim -layers trim边界。

bgcolor=`convert oHBWq.gif[0] -format "%[pixel:u.p{0,0}]" info:`
num=`convert oHBWq.gif -format "%n\n" info: | head -n 1`
echo "num=$num"
(for ((i=0; i<num; i++)); do
convert oHBWq.gif -trim -layers TrimBounds miff:- |\
convert -[$i] -background "$bgcolor" -layers flatten miff:-
done ) |\
convert -dispose previous -delay 10 - -loop 0 output3.gif

这是关闭但是对于一帧:

bgcolor=`convert oHBWq.gif[0] -format "%[pixel:u.p{0,0}]" info:`
convert -dispose previous -delay 10 oHBWq.gif -trim -layers TrimBounds -background "$bgcolor" -layers optimize -loop 0 output5.gif

enter image description here

答案 1 :(得分:2)

最后,这似乎在ImageMagick中使用一行来获取背景颜色和一行处理。不需要临时文件。

bgcolor=`convert input.gif[0] -format "%[pixel:u.p{0,0}]" info:`
convert -dispose previous -delay 10 -background "$bgcolor" input.gif -trim -layers TrimBounds -coalesce -layers optimize -loop 0 output.gif

enter image description here

答案 2 :(得分:2)

你可以使用IM的“-distort”和定义的视口完成这种修剪。

convert oHBWq.gif -coalesce +repage -background none \
   \( -clone 0--1 -trim -flatten -trim \) \
   -set option:distort:viewport %[fx:u[-1].w]x%[fx:u[-1].h]+%[fx:u[-1].page.x]+%[fx:u[-1].page.y] \
   -delete -1 -distort SRT 0 +repage output.gif

克隆输入框架,单独修剪它们,并使它们保持原始对齐以展平它们。然后它再次修剪那个扁平的,以摆脱多余的透明背景。结果将是正确的大小,并为完成的图像具有正确的页面偏移。您不必知道背景颜色。

现在,您可以轻松地将这些尺寸和偏移量转换为扭曲视口设置,并执行无操作扭曲。删除用于获取测量结果的克隆扁平的,“+重新”其余部分,并完成所需的任何其他GIF设置。