不少人腦中可能已經浮現出 Photoshop, GIF Animator, FormatFactory 等軟件
但以上軟件都不是能在 Linux 上執行的軟件,若果要在 Linux 截取影片製作成 GIF 動態圖片,又有沒有方法?
Linux 上製作 GIF 並不簡單,因為 Linux 暫時並未有獨立軟件可以直接從影片轉換 GIF 的方法
要在 Linux 上進行處理,需要:
1. 從影片截取指定範圍

需要轉換的影片

使用 Avidemux 截取指定範圍
Avidemux 是其中一種影片轉換軟件,而且是開源、免費及跨平台軟件
2. 將截取的範圍轉換成連續圖片

利用 FFmpeg 將截取的範圍轉換成連續圖片
使用指令
ffmpeg -i video capture-%3d.pngffmpeg 中
-i video 為輸入的影片
output-%3d.png 為輸出,根據副檔名自動編碼
%3d 是一種與 C 的 printf 一樣的輸出格式,%3d 為十進位值,不足 3位數 則在左方補 0
若連續圖片數量相當多,可以將 3 改成更大的數值
其實 FFmpeg 都可以截取範圍
ffmpeg -i video -ss h:m:s.ms -t h:m:s.ms capture-%3d.png-ss 為開始時間
-t 為影片長度,不是結束時間,所以需要計算
當中的 h 為小時(最多2位值), m 為分鐘(最多2位值), s 為秒(最多2位值), ms 為毫秒(最多3位值)
若果知道截取的開始時間及長度,直接用 FFmpeg 便可以簡化步驟

輸出後的連續圖片
3. 將連續圖片合成
在 Linux 中可以使用 ImageMagick convert 指令很方便地將連續圖片合成
convert -delay 2 capture-*.png capture.gif-delay 2 為圖片與圖片之間的延遲時間,以百分秒計算
capture-*.png 為連續圖片
capture.gif 為輸出的 GIF 動態圖片
或使用 GIMP

將連續圖片匯入至 GIMP

在圖層中列出匯入的圖片
留意,若需要將連續圖片轉換成 GIF 動態圖片
最底的圖層是第一畫格,最頂的圖層是最後畫格,次序是由下至上排列

匯出圖片,並給予 gif 的副檔名

點選 As animation 以匯出具動態的 GIF
而延遲則以毫秒(即千分秒)計算
這設定需要留以,若圖層上沒有指定延遲時間,則會將此數值套用之全部圖片中
若要指定某些圖片的延遲時間,只需要在圖層加上 (?ms) 即可
例如圖層是 capture-001.png 將圖層改為 capture-001.png (1000ms)
capture-001.png 便會延遲 1000毫秒(即1秒),指定延遲時間會比選項的時間優先


處理後的結果
左邊為 ImageMagick convert 進行最後合成步驟,右邊為 GIMP
以 ImageMagick convert 輸出能較保持連續圖片原來的品質
而以 GIMP 輸出則比連續圖片原來的品質為差
沒有留言 :
張貼留言