.gif
画像の特定のセットから.jpg
アニメーション画像を作成したい。
コマンドラインから実行したいので、コマンドラインツールは大歓迎です。
ImageMagick パッケージを使用できます。次のコマンドを使用してインストールします。
Sudo apt-get install imagemagick
これで、次を使用して、いくつかの写真(gif
)からjpg
を作成できます。
convert -delay 20 -loop 0 *.jpg myimage.gif
@Maythux回答を完了するには:
-resize
オプションを使用できます。私の場合、4608x3456の画像があり、生成されたgifは32個の画像に対して300M以上でした
convert -resize 20% -delay 20 -loop 0 *.jpg myimage.gif
または
convert -resize 768x576 -delay 20 -loop 0 *.jpg myimage.gif
*.jpg
は、数値を処理する際に少々手間がかかります。ソートされていない写真でgifを生成できます。
$ ls|cat
21-33-26_1.jpg
21-33-26_10.jpg // <--- this one
21-33-26_2.jpg
21-33-26_3.jpg
21-33-26_4.jpg
21-33-26_5.jpg
21-33-26_6.jpg
21-33-26_7.jpg
21-33-26_8.jpg
21-33-26_9.jpg
21-33-28_1.jpg // <--- should be here
21-33-28_2.jpg
21-33-28_3.jpg
...
ショットは非常に高速(10/s)で撮影されたため、すべて同じ修正時間であり、たとえばls -t
を使用してだますことはできません。 Ubuntuでは、代わりにls -v
を使用できます。
convert -resize 768x576 -delay 20 -loop 0 `ls -v` myimage.gif
Mac OS Xでは数値による並べ替えが非常に難しいですが、カスタムスクリプトを作成する必要があると思います。
コメントするほどの評判はありませんが、ファイル名を変更する代わりに、グロビングを使用してシェルにファイル名を展開させることができます
convert -resize 50% -delay 10 -loop 0 image_{0..99}.jpg output.gif
ffmegソリューション+テストデータ
Ubuntu 18.10、ffpmeg 4.0.2-2、ImageMagick 6.9.10-8の時点で、ffmpegの方がはるかに高速で、 はるかに少ないメモリ を使用していることがわかりました。
最も簡単な変換コマンドは次のとおりです。
ffmpeg \
-framerate 60 \
-pattern_type glob \
-i '*.png' \
-r 15 \
-vf scale=512:-1 \
out.gif \
;
次の方法でテストデータを取得できます。
wget -O opengl-rotating-triangle.Zip https://github.com/cirosantilli/media/blob/master/opengl-rotating-triangle.zip?raw=true
unzip opengl-rotating-triangle.Zip
cd opengl-rotating-triangle
テストデータは次のように生成されました: https://stackoverflow.com/questions/3191978/how-to-use-glut-opengl-to-render-to-a-file/14324292#14324292 および256個の1024x1024 PNG画像が含まれています。
そして、今すぐブラウザで直接生成できる別のテストデータがあります! https://stackoverflow.com/questions/19235286/convert-html5-canvas-sequence-to-a-video-file/57153718#57153718
私が強調したい重要なffmpeg
オプションは次のとおりです。
-pattern_type glob
:画像を選択する便利な方法
-framerate 60
:入力画像で60 FPSを想定し、同じFPSを出力します。
ffmpeg
は、ビデオ形式と同様に画像内にFPSデータがないため、他の方法では認識できません。
256個の入力フレームが完了するまでに約4秒かかります。
-r 15
:オプション。 4つの画像ごとに1つを選択して、サイズを小さくします(4 == 60 / 15
)。
これにより、identify out.gif
は、GIFには64フレームしか含まれていないことを示します。
再生にはまだ4秒かかります。そのため、遅延は、物事が一致するように変更されます。
-vf scale=512:-1
:オプション。通常、サイズを縮小してスペースを節約するために、幅とスケールの高さを比例して設定します。
ImageMagickを機能させるには、最初に/etc/ImageMagick-6/policy.xml
でディスクとメモリの制限を変更する必要がありました。説明は https://superuser.com/questions/1178666/imagemagick-convert-quits-after-一部のページ
こちらもご覧ください:
ImageMagick vs ffmpegベンチマーク
コマンドを比較しました:
/usr/bin/time -v convert *.png -deconstruct -delay 1.6 out-convert.gif
/usr/bin/time -v ffmpeg \
-framerate 60 \
-pattern_type glob \
-i '*.png' \
out-ffmpeg.gif \
;
コマンドは、比較を有効にするためにできるだけ近い出力を生成するように構築されました。
/usr/bin/time -v
:以下で説明されているように、最大メモリ使用量を見つけるために使用されます。 https://stackoverflow.com/questions/774556/peak-memory-usage-of-a-linux-unix-process =
-deconstruct
:GIF画像には、GIFを小さくするために、前のフレームから変更された最小の長方形のみを含めることができます。
ffmpeg
はデフォルトでこれらの差分を計算しますが、ImageMagickは-deconstruct
が使用されない限り計算しません。
基本的に、ImageMagickで毎回そのオプションを使用する必要があります。
次のようにして違いを観察できます。
identify out.gif
圧縮バージョンでは、すべてのフレームのサイズが最初のものよりも小さくなります。例:
out.gif[0] GIF 1024x1024 1024x1024+0+0 8-bit sRGB 256c 16.7865MiB 0.010u 0:00.010
out.gif[1] GIF 516x516 1024x1024+252+257 8-bit sRGB 256c 16.7865MiB 0.010u 0:00.010
out.gif[2] GIF 515x520 1024x1024+248+257 8-bit sRGB 256c 16.7865MiB 0.010u 0:00.010
この例では、2番目のフレームは完全な1024x1024ではなく516x516
のみであり、252+257
のオフセットに配置されます。したがって、中央の三角形のみが含まれます。
-delay
:ffmpeg
の60FPSに一致する値。変換のパフォーマンスには関係ありませんが、リスクを冒したくありません。
出力GIFのサイズはほぼ同じで、視覚的には同じように見えます。
ImageMagickを取得します。
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:56.16
Maximum resident set size (kbytes): 2676856
ffmpegの場合:
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:04.41
Maximum resident set size (kbytes): 97172
そこから私たちはそれを見ます:
テストハードウェア:Lenovo ThinkPad P51ラップトップ 、Intel Core i7-7820HQ、32GB(16 + 16)DDR4 2400MHz SODIMM、512GB SSD PCIe TLC OPAL2.
Imagemagickパッケージに含まれているconvertというプログラムを使用できます。コマンドライン駆動ですが、非常に使いやすいです。ソフトウェアセンターからインストールするか、コマンドプロンプトで次のように入力します。
Sudo apt-get install imagemagick
次に、.gifを作成します。
convert -delay 100 -size 100x100 xc:SkyBlue \
-page +5+10 balloon.gif -page +35+30 medical.gif \
-page +62+50 present.gif -page +10+55 shading.gif \
-loop 0 animation.gif
*上記の例は Image Magickの例