TL;DR
このように書けば、Animated GIFを変換できます。
image.variant(
loader: { page: nil }, # GIFアニメーションの全フレームを変換する
scale: '50%', # 1/2の大きさにする
coalesce: true, # アニメーションシーケンスの最適化
deconstruct: true, # アニメーションシーケンスの最適化2
dither: true, '+': true, # エイリアシングを無効化して処理を早くする
layers: 'Optimize', # GIFアニメーションを最適化
)
コツ
重要なのはloader: { page: nil }
というオプションで、variantはデフォルトでは最初の1フレームしか変換を掛けてくれません。なので、pageの指定を無くすことで全フレームに対して変換を掛けます。
coalesceオプションとdeconstructオプションについては、下記のサイトが詳しいと思います。
https://unoh.github.io/2008/12/11/imagemagickgif.html
あとは+dither
というオプションの書き方です。dither: true
と書くと、-dither
というオプションになってしまいます。
今回は+dither
で実行したいので、そういう場合は一度dither: true
と宣言した直後に'+': true
と書くことで、+dither
というオプションにしてくれます。
...combine_options(Rails6から非推奨)で使っていた手法をそのまま持ってきたのですが、このやり方のドキュメントが見つからず苦労しました。正直ここの理屈も分かっていません。分かる方がいらっしゃったら、編集リクエストを送って頂くか、コメントにてご教授頂けると幸いです。