Blender から透過アニメーションGIFを出力する方法

Blender は MPEG などのアニメーションを出力することはできますが、アニメーションGIF (以下、**AGIF**) には直接出力できません。次のようなステップを踏む必要があります。

1. 全フレームをアニメーションを透過PNGで出力する
1. AGIF にコンパイルする
1. 最適化・軽量化する

以下は Blender から AGIF を作る手順です。



作業環境
----

- Windows 10 Home 1903
- Blender 2.83.2
- ffmpeg 4.3
- Gifsicle 1.92




チュートリアル
----

### Blender で透過画像を出力する

![Render Properties](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8267/fda2de34-123d-0085-8561-239af9d98e37.png)

![Output Properties](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8267/249d5f06-c3c2-c00a-7695-d3f3ab69cefc.png)

- "Render プロパティー > Film > Transparent" = ON
- "Output プロパティー > Output"
    - "File Format" = PNG
    - "Color" = RGBA
    - 出力パスは好きなパスを指定

上記を設定したら、 "メニューバー > Render > Render Animation (Ctrl+F12)" でアニメーション出力しましょう。


### FFMPEG でコンパイル

伝統の FFMPEG を使って、複数画像を1枚の AGIF にまとめます。まずは FFMPEG をダウンロード＆解凍してください。

[Download FFmpeg](https://ffmpeg.org/download.html)

続いて、コマンドライン (Windows Terminal) で以下のコマンドを叩いてコンパイルします。

```
cd c:\tmp\animation

# シンプル版

ffmpeg.exe -i .\%04d.png -filter_complex "fps=24,split[a],palettegen,[a]paletteuse" -y output.gif

# パレット最適化版 (やや容量が小さくなる可能性あり)

ffmpeg.exe -i .\%04d.png -filter_complex "fps=24, setpts=PTS/0.5, split[a][b];[a] palettegen [p];[b][p] paletteuse=dither=none" -y output.gif
```

コマンドが何をやっているか、簡単に解説すると次のようになります。

- `-i`: インプットファイル
    - 今回は4桁の連番ファイルをまとめたので、 `%04d` と記述
    - 3桁なら `%03d`
- `-filter_complex`: FFMPEG 内部の GIF 処理コマンド群
    - GIF は256色しか表現できないため、最初に `palettegen` で元画像からカラーパレット画像を出力する
        - 1色は透過用なので、使えるのは実質255色
    - `fps` は Blender の出力時の値と合わせる
    - `setpts`: 再生速度の変更
        - `PTS/2` -> 2倍 (倍速)
        - `PTS/0.5` -> 0.5倍 (速度半減)
        - （スラッシュが除算に見えるが意味は逆なのがキモい）
- `-y`: 出力ファイルが存在しても上書き

これでフォルダ内に AGIF が作成されます。

そのまま使ってもいいですが、ネット回線に優しくなるよう軽量化もしましょう。


### 軽量化

オンラインツールでは [Optimize animated GIF](https://ezgif.com/optimize) を使うのが一番楽です。十分軽量化されますし処理も速いので、特に理由がなければこちらを使って軽量化しましょう。

あえて自分でコマンドラインで軽量化したい人のために、[Gifsicle](https://www.lcdf.org/gifsicle/) を使う場合の手順も示しておきます。

- ダウンロード先: [Gifsicle for Windows](https://eternallybored.org/misc/gifsicle/)
- 使い方:
    - [compression - Optimize animated GIF size in command-line - Super User](https://superuser.com/questions/1107200/optimize-animated-gif-size-in-command-line)
    - [Gifsicle Man Page](https://www.lcdf.org/gifsicle/man.html)

シンプルなツールなので上記マニュアル通りでサクッと軽量化できます。私が実験したところ、以下のパラメーターでそこそこ元の見た目を保ちながら、容量を 50% 程度削減できました。

```
gifsicle.exe -i input.gif --optimize=3 --lossy=500 -o compressed.gif
```

- `-i`: FFMPEG で出力したファイルを指定
- `-o`: 圧縮後のファイル出力先
- `--optimize`: 1(default)～3
    - 3が一番遅いが、圧縮率が高い
- `--lossy`: 値が大きいほど、画質が悪くなる代わりに圧縮率が上がる
    - GIF に含まれる色数にもよるが、200-500 で十分


以上で軽量な AGIF の作成が完了しました。

この手順を使って、クールなインターネット・ミームを生み出してください。

[![3d Saxophone GIF](https://media.giphy.com/media/GD5MSJes52mg8/giphy.gif)](https://giphy.com/gifs/GD5MSJes52mg8)






参考リンク
----

- [PNGファイルからGIFアニメーションを作成する](https://qastack.jp/unix/24014/creating-a-gif-animation-from-png-files)
- [ffmpegでとにかく綺麗なGIFを作りたい - Qiita](https://qiita.com/yusuga/items/ba7b5c2cac3f2928f040)
- [ffmpegでGIFアニメを作る - 脳内メモ＋＋](http://fftest33.blog.fc2.com/blog-entry-69.html)
- [動画をトリミングして背景透過アニメーションGIFを作ってみた - Qiita](https://qiita.com/OXamarin/items/24ebf11231098fa49576)
- [ffmpegで動画から綺麗なgif画像(アニメーション)を作成する - Askthewind's diary](https://askthewind.hatenablog.com/entry/2019/03/14/201639)