LoginSignup
7
7

More than 5 years have passed since last update.

ffmpegとImageMagickでクロマキーmovをgifアニメーションにする

Last updated at Posted at 2016-03-20

movを綺麗にgifに変換するには、まずパレットを生成する必要がある。

ffmpeg -i hoge.mov -vf palettegen palette.png

つぎにこのpaletteを用いて、movからgifファイルを生成する。

ffmpeg -i hoge.mov -i palette.png -filter_complex paletteuse out.gif

最後にこのgifファイルにクロマキー処理をする。
色はblueのようなプリセット、または'rgb(0,0,200)'のように指定する。

今回はクロマキーなので、ある程度幅のある値をとって欲しい。
whiteを95%の範囲で透明にする(gifなので階調指定はできないが)するには、次のようにする。

convert -white-threshold 95% -transparent white out.gif trans.gif

と思うじゃろ?

しかし、これではgifアニメーションにおかしな軌跡が写り込んでしまう。
これは、ffmpegが変換する際に圧縮を行うので、各フレームごとに前フレームからのdiffを取っているため。
背景が真っ白だったら、画像のない部分を常に白で上書きすれば問題ないが、透明になった場合は写り込んでしまうのでダメ。
Imagemagickのtransparentオプションは白部分を透明にするだけなので、
結果、前フレームのゴミが次のフレームに写り込んでしまう。

どうすればいいか

透明なので、毎回前フレームの情報を消去して書きなおせば良い。
つまり、各フレームは必然的に画像情報を全て持っていることになるので、ファイルサイズは大きくなってしまうが仕方ない。

ffmpegの出力結果out.gifを、一度imagemagickで次のように処理する。

convert -coalesce -loop 0 out.gif out_coalesce.gif

-coalesceオプションを付けると、各フレームが全画素情報を持つようになる。
(ここで-dispose previousオプション(後述)を付けてはいけない。)
次に、これを次のように変換する。

convert -white-threshold 95% -transparent white -coalesce -dispose previous -loop 0 out_coalesce.gif trans_coalesce.gif

透明化のオプションは先ほどと同じ。
-dispose previousオプションを付けると、前画像の情報を全て破棄し、次フレームの情報のみを再描画する。
ここでも-coalesceを付けるのを忘れずに。

参考

http://fftest33.blog.fc2.com/blog-entry-69.html
http://www.imagemagick.org/script/color.php
http://stackoverflow.com/questions/27099682/imagmgick-multiple-color-and-transparent-image-with-anti-aliasing
http://www.imagemagick.org/Usage/anim_basics/

7
7
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7