1

鑑於GIF動畫在一個堅實的背景顏色如何修剪動畫的gif(使用imagemagick)?

animated bunny with padding

我想修剪掉填充。具體而言,我想對所有幀圖像裁剪前景物體的最大程度:

animated bunny without padding

我似乎無法找到-alpha-background的正確組合以實現這一目標單個convert命令。例如,如果我發出

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考慮顯式裁剪而不是自動裁剪。

回答

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文件。 subshel​​l循環處理與你的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

+0

這些肯定會朝着正確的方向發展。這使用convert很難做到,對嗎? –

+0

它會出現這樣。但我會繼續研究它。 – fmw42

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

可以完成這類使用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設置。