web-dev-qa-db-ja.com

JPEG画像のセットからアニメーションGIFを作成する

Windows 7でスクリプト化できるものが必要です。この画像はバナーで使用されます。

31
Cbox

ffmpeg でこれを行うことができます

最初に画像をビデオに変換します。

ffmpeg -f image2 -i image%d.jpg video.avi

(これにより、現在のディレクトリ(image1.jpg、image2.jpg ...という名前)の画像がvideo.aviという名前のビデオファイルに変換されます。)

次に、aviをgifに変換します。

ffmpeg -i video.avi -pix_fmt rgb24 -loop_output 0 out.gif

ffmpegのWindowsバイナリはこちら を取得できます。


mplayer でも同様のことができます。 複数の入力画像ファイルからのエンコード を参照してください。

コマンドラインは次のようなものになると思います:

mplayer mf://*.jpg -mf w=800:h=600:type=jpg -vf scale=160:120 -vo gif89a:fps=3:output=out.gif

(800と600はソースの幅と高さ、160と120はターゲットの幅、height.out.gifはターゲットファイル名です)


これらの両方をテストしたところ、どちらも正常に動作します。しかし、解像度とフレームレートを指定することができたので、mplayerからより良い結果を得ました。あなたの走行距離は異なる場合があり、あなたが見た場合、あなたはffmpegのためのより多くのオプションを見つけることができると確信しています。

47
Simon P Stevens

サイモンPスティーブンスの答え ほとんど私をそこに着いた:

ffmpeg -f image2 -i image%d.jpg video.avi
ffmpeg -i video.avi -pix_fmt rgb24 -loop_output 0 out.gif

これを上手くこなせるかどうか見てみましょう。

Avi経由で行く必要はありません。 -pix_fmt of rgb24は無効であり、-loop_outputオプションは、ループを防ぎますが、これは望ましくありません。我々が得る:

ffmpeg -f image2 -i image%d.jpg out.gif

入力画像にはゼロが埋め込まれた3桁の数字のラベルが付いており、そのうち30個(image_001.jpg、image_002.jpg、...)があるため、書式指定子を修正する必要があります

ffmpeg -f image2 -i image_%003d.jpg out.gif

私の入力画像は携帯電話のカメラからのもので、大きすぎます!それらを縮小する必要があります。

ffmpeg -f image2 -i image_%003d.jpg -vf scale=531x299 out.gif

また、時計回りに90度回転する必要があります

ffmpeg -f image2 -i image_%003d.jpg -vf scale=531x299,transpose=1 out.gif

このgifはフレーム間でゼロ遅延で再生されますが、これはおそらく望んでいないことです。入力画像のフレームレートを指定する

ffmpeg -f image2 -framerate 9 -i image_%003d.jpg -vf scale=531x299,transpose=1 out.gif

画像は少し大きすぎるので、空の100ピクセルを切り取ります。転置はこれをトリッキーにします、私は後回転されたxとyの値を使用します:

ffmpeg -f image2 -framerate 9 -i image_%003d.jpg -vf scale=531x299,transpose=1,crop=299,431,0,100 out.gif

最終結果-私は私の仲間の素晴らしい表情を世界と共有することができます:

Example of an animated gif created with ffmpeg

69
dwurf

ImageMagickの場合:

convert *.png a.gif
35
psycho brm

ffmpegto。aviand.avito。gifは機能しましたが、注意すべきことは、画像に完全な名前を付ける必要があることですギャップなしで機能するように数値の順序を増やします。このffmpegレシピが機能するように、すべての画像の名前を適宜変更するために、簡単なpythonスクリプトを作成しました:

import os

files = [ f for f in os.listdir('.') if os.path.isfile(os.path.join('.',f)) and f.endswith('.jpg') ]
for i, file in enumerate(sorted(files)):
    os.rename(file, 'image%03d.jpg' % i)

そして、私は変換を行うためにffmpegよりもはるかに簡単なアプローチにつまずいたが、これは単にImageMagickのコマンドライン変換ツールを使用している

convert image%03d.jpg[0-198] animated_gif.gif

その人たちほど簡単にはなりません。

ここに要点: https://Gist.github.com/328984

12

Simon P Stevensとdwurfの回答に基づいて、私はこの単純化されたソリューションを思い付きました。

ffmpeg -f image2 -framerate 1 -i image%d.jpg video.gif

これにより、画像ごとに1秒のレートが得られます。必要に応じてframerate値を調整します。

5
luator

dwurf の答えに追加したいのですが、これは標準の256色パレットでgifを生成しますが、視覚的にはあまり美しくありません。

私は twoblog-posts を見つけ、アニメーションにカスタムパレットを使用して視覚的品質を改善するために、それらを私のニーズに合わせました:

カラーパレットを生成します。

ffmpeg -f image2 -i image%d.jpg -vf scale=900:-1:sws_dither=ed,palettegen palette.png

3番目のコマンドは単一の入力ビデオでのみ機能し、画像の束では機能しないため、画像を目的のフレームレートの通常のビデオに変換します

ffmpeg.exe -f image2 -framerate 1.2 -i image%d.jpg video.flv

生成されたパレットで生成されたビデオを、より美しいgifに変換します。

ffmpeg.exe -i video.flv -i palette.png -filter_complex "fps=1.2,scale=900:-1:flags=lanczos[x];[x][1:v]paletteuse" video.gif
3
Alexander Pacha