2016/05/11

製作 GIF 動圖的方法(5)

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

沒有留言:

張貼留言