给出一个纯色背景上的GIF动画
我想修剪远离填充。具体来说,我想在所有帧上将图像裁剪到前景对象的最大范围:
我无法通过单个-alpha
命令找到-background
,convert
的正确组合来实现此目的。例如,如果我发出
convert -dispose 2 input.gif -trim -layers TrimBounds fail.gif
我得随机"背景" 单个修剪范围小于所有帧的最大范围的帧的颜色:
我可以使用一长串命令来实现正确的输出:
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考虑显式裁剪而不是自动裁剪。
答案 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
这与上面的内容相同,但只需要保存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
答案 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
答案 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设置。