Make
an animated GIF from the command line (5)
【前言】
有時,動圖在循環播放時,要能無縫接軌,還可以用淡出淡入加頭尾重疊的方法。也就是說,末後數個畫格淡出,開頭數個畫格淡入,而這兩部分是疊在一起的,中間一段未加工。更極端的是沒有中間未加工的一段,所有畫格前半淡入,後半淡出,全部重疊。這種方法可用在瀑布、海浪、火焰、雲等場合。
前篇用過的影片中,有火焰的畫面,可以試試。
【步驟】
1.
抽出圖片。
ffmpeg
-ss 19 -i source.mp4 -t 2 images\1%3d.png
兩秒共
48
畫格。
2.
編輯圖片。
for
/L %a in (1001,1,1048) do ^
magick
convert images\%a.png -resize 30% +repage images\b%a.png
縮小為
30%。
3.
製作未處理的動圖,做對照參考。
magick
convert -delay 1x24 images\b*.png -fuzz 3% -layers
OptimizeTransparency fire.gif
可以看得出來有畫面不連續的現象。
4.
製作淡出淡入又重疊的畫格。
以
9
個畫格舉例。
頭是從
b1001.png
到
b1009.png,尾是從
b1040.png
到
b1048.png。
將
b1001.png
和
b1040.png
重疊,依此類推。圖示如下:
cd
images
magick
convert b1040.png b1001.png -compose dissolve -define compose:args=10
-composite c1.png
magick
convert b1041.png b1002.png -compose dissolve -define compose:args=20
-composite c2.png
magick
convert b1042.png b1003.png -compose dissolve -define compose:args=30
-composite c3.png
magick
convert b1043.png b1004.png -compose dissolve -define compose:args=40
-composite c4.png
magick
convert b1044.png b1005.png -compose dissolve -define compose:args=50
-composite c5.png
magick
convert b1045.png b1006.png -compose dissolve -define compose:args=60
-composite c6.png
magick
convert b1046.png b1007.png -compose dissolve -define compose:args=70
-composite c7.png
magick
convert b1047.png b1008.png -compose dissolve -define compose:args=80
-composite c8.png
magick
convert b1048.png b1009.png -compose dissolve -define compose:args=90
-composite c9.png
cd
..
這是重疊兩圖的指令,基本語法是:
magick
convert 下層圖
上層圖 -compose
組合法
-define
compose:args=組合參數值
-composite
輸出圖
組合法有:
dissolve
(淡出淡入)
改變透明度
blend
(混合)
改變透明度
(相加)
mathematics
(數學)
依特定公式運算
(尚未提供此法)
modulate
(調色)
改變亮度、飽和度、色度
displace
(位移)
縮放,如放大鏡
distort
(扭曲)
(尚未提供此法)
blur
(模糊)
dissolve
的參數:上圖透明度百分比[x下圖透明度百分比]
註一:此指令有另一相當的指令:
composite
-dissolve 參數
上層圖 下層圖 輸出圖
但經試驗,在
Windows
10 無效,而
Linux
Ubuntu 有效。
註二:有時須加
-alpha
Set
選項。
5.
選圖。
要用來製作動圖的畫格是前步驟做出來的
c1.png
到
c9.png
和未重疊(即未處理)的部分
b1010.png
到
b1039.png。將這些檔案單獨放在
images
資料夾。
6.
製作動圖。
magick
convert -delay 1x24 images\*.png -fuzz 3% -layers
OptimizeTransparency fire-dissolve.gif
【後語】
1.
完整批次檔在【附錄一】。
2.
上述範例是重疊
9
畫格,已比未重疊者改善。若要更平順,可每次改
5%,也就是重疊
19
畫格。完整批次檔在【附錄二】。
3.
有時不須特別處理,動圖在循環播放時便能無縫接軌,上述影片中有一下雨的片段,就是一個例子,只是這種情況不多。
ffmpeg
-ss 45 -i source.mp4 -t 2 images\1%3d.png
for
/L %a in (1001,1,1048) do magick convert images\%a.png -resize 50%
+repage images\b%a.png
magick
convert -delay 1x24 images\b*.png -fuzz 2% -layers
OptimizeTransparency rain.gif
4.
以上範例都是一小段影片的每一畫格都使用,若有跳格呢?
在同一影片中有一海浪的場景,此處示範共取
4
秒,每
2
個畫格取
1
個,重疊
19
畫格。完整批次檔在【附錄三】。
未處理的動圖
處理的動圖
【附錄一】
火焰完整批次檔 -
重疊
9
格
::
抽出圖片
ffmpeg
-ss 19 -i source.mp4 -t 2 images\1%%3d.png
::
編輯圖片
for
/L %%a in (1001,1,1048) do ^
magick
convert images\%%a.png -resize 30%% +repage images\b%%a.png
::
製作未處理的動圖
magick
convert -delay 1x24 images\b*.png -fuzz 3%% -layers
OptimizeTransparency fire.gif
::製作淡出淡入又重疊的畫格
setlocal
enabledelayedexpansion
for
/L %%b in (1,1,9) do ^
set
/a up=1000+%%b & ^
set
/a down=1048-9+%%b & ^
set
/a percent=10*%%b & ^
magick
convert images\b!down!.png images\b!up!.png -compose dissolve -define
compose:args=!percent! -composite images\c%%b.png
echo
選圖
pause
::
製作動圖
magick
convert -delay 1x24 images\*.png -fuzz 3%% -layers
optimizetransparency fire-dissolve.gif
【附錄二】
火焰完整批次檔 -
重疊
19
格
::
抽出圖片
ffmpeg
-ss 19 -i source.mp4 -t 2 images\1%%3d.png
::
編輯圖片
for
/L %%a in (1001,1,1048) do ^
magick
convert images\%%a.png -resize 30%% +repage images\b%%a.png
::
製作未處理的動圖
magick
convert -delay 1x24 images\b*.png -fuzz 3%% -layers
OptimizeTransparency fire.gif
::製作淡出淡入又重疊的畫格
setlocal
enabledelayedexpansion
for
/L %%b in (1,1,19) do ^
set
/a up=1000+%%b & ^
set
/a down=1048-19+%%b & ^
set
/a percent=5*%%b & ^
set
/a output=100+%%b & ^
magick
convert images\b!down!.png images\b!up!.png -compose dissolve -define
compose:args=!percent! -composite images\c!output!.png
echo
選圖
pause
::
製作動圖
magick
convert -delay 1x24 images\*.png -fuzz 3%% -layers
optimizetransparency fire-dissolve-19.gif
【附錄三】
海浪完整批次檔 -
重疊
19
格
set
duration=4
set
framerate=24
set
step=2
set
overlap=19
set
/a first=1000+1
set
/a last=1000+%duration%*%framerate%
set
from=1
set
/a to=%step%*%overlap%
::
抽出圖片
ffmpeg
-ss 10 -i source.mp4 -t %duration% images\1%%3d.png
::
編輯圖片
for
/L %%a in (%first%,%step%,%last%) do ^
magick
convert images\%%a.png -resize 30%% +repage images\b%%a.png
::
製作未處理的動圖
magick
convert -delay %step%x%framerate% images\b*.png -fuzz 3%% -layers
OptimizeTransparency wave.gif
::製作淡出淡入又重疊的畫格
setlocal
enabledelayedexpansion
for
/L %%b in (%from%,%step%,%to%) do ^
set
/a up=1000+%%b & ^
set
/a down=%last%-%step%*%overlap%+%%b & ^
set
/a percent=100/(%overlap%+1)*((%%b-1)/%step%+1) & ^
set
/a output=100+%%b & ^
magick
convert images\b!down!.png images\b!up!.png -compose dissolve -define
compose:args=!percent! -composite images\c!output!.png
echo
選圖
pause
::
製作動圖
magick
convert -delay %step%x%framerate% images\*.png -fuzz 3%% -layers
optimizetransparency wave-dissolve.gif
沒有留言:
張貼留言