回答:
ファーストラン:
convert do.gif -coalesce temporary.gif
それから
convert -size <original size> temporary.gif -resize 24x24 smaller.gif
gifsicle --resize 24x24 > do-24.gif
これもできます
-coalesce
+ -deconstruct
後に-coalesce
、あなたはおそらく追加したい-deconstruct
:
convert in.gif -coalesce -resize 256x -deconstruct out-deconstruct.gif
この問題の根本的な原因は、入力GIFが適切に最小化されたことです。GIFを使用すると、次のフレームを、オフセットされた前のフレームから変更された長方形にすることができます。
-coalesce
次に、すべてのフレームを元のサイズに拡大します。これにより、サイズ変更が機能しますが、入力画像としてフレームが再び圧縮されることはありません-deconstruct
。
この回答のテストデータを使用して:静止画像からアニメーションGIFを作成する方法(できればコマンドラインを使用)?これを次のように明確に見ることができますidentify
。
$ identify out-convert.gif | head -n 3
out-convert.gif[0] GIF 1024x1024 1024x1024+0+0 8-bit sRGB 256c 16.7865MiB 0.020u 0:00.019
out-convert.gif[1] GIF 516x516 1024x1024+252+257 8-bit sRGB 256c 16.7865MiB 0.030u 0:00.019
out-convert.gif[2] GIF 515x520 1024x1024+248+257 8-bit sRGB 256c 16.7865MiB 0.030u 0:00.019
$ convert out-convert.gif -resize 256x out.gif
$ identify out.gif | head -n 3
out.gif[0] GIF 256x256 256x256+0+0 8-bit sRGB 256c 5.0479MiB 0.000u 0:00.009
out.gif[1] GIF 256x256 256x256+125+128 8-bit sRGB 256c 5.0479MiB 0.000u 0:00.009
out.gif[2] GIF 256x258 256x256+123+128 8-bit sRGB 256c 5.0479MiB 0.000u 0:00.009
$ convert out-convert.gif -coalesce -resize 256x out-coalesce.gif
$ identify out-coalesce.gif | head -n 3
out-coalesce.gif[0] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.97683MiB 0.010u 0:00.009
out-coalesce.gif[1] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.97683MiB 0.010u 0:00.009
out-coalesce.gif[2] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.97683MiB 0.010u 0:00.009
$ convert out-convert.gif -coalesce -resize 256x -deconstruct out-deconstruct.gif
$ identify out-deconstruct.gif | head -n 3
out-deconstruct.gif[0] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.87942MiB 0.010u 0:00.010
out-deconstruct.gif[1] GIF 135x135 256x256+60+61 8-bit sRGB 256c 1.87942MiB 0.010u 0:00.010
out-deconstruct.gif[2] GIF 135x136 256x256+59+61 8-bit sRGB 256c 1.87942MiB 0.010u 0:00.010
out.gif
out-coalesce.gif
out-deconstruct.gif
最初に、ファイル2を入力する方法を確認します。out-convert.gif
フレーム2は516x516
offsetにあるため252+257
、実際には圧縮されていますが、フレーム1はフルサイズです1024x1024
。
次に、3つのコンバージョンを比較すると:
out.gif
:すべてのフレームは256x256
5MiB以上で巨大であり、TODOなのはなぜですか?
ほぼ256x256
フレームにはゼロ以外のオフセットがあるため、視覚的には正しくありません(125+128
フレーム2など)。
out-coalesce.gif
:すべてのフレームに256x256
正しいオフセットがあります0+0
。
出力は視覚的には正しいように見えますが、出力ファイルのサイズは2.0 MiBです。 out-deconstruct.gif
out-deconstruct.gif
:圧縮フレーム、最終出力サイズ1.9 MiB。
に比べてそれほど小さくはありませんがout-coalesce.gif
、これは黒い地面が本当によく圧縮されているからだと思います。一般的には非常に重要です。
ffmpegとgifsicle
また、次のコマンドも試しました。
ffmpeg -i out-convert.gif -vf scale=256:-1 out-ffmpeg-small.gif
gifsicle --resize 256x256 out-convert.gif > out-gifsicle.gif
そして、どちらも1.5 MiBの出力をさらに小さく表示します。
参照:静止画像からアニメーションGIFを作成するには(コマンドラインを使用するのが望ましい)。
TODO:なぜ彼らはそれをより小さくすることができconvert
ますか?彼らはより良い最小の差分長方形を選択しているだけですか、それとも何か他のものですか?
Ubuntu 18.10、ffpmeg 4.0.2-2、ImageMagick 6.9.10-8でテスト済み。
私はそれに慣れているのでimagemagickソリューションを探していましたが、最終的には@samの提案で行きましたgifsicle
。それは私が望んでいたことだけで、面倒なことはしなかった。
結果として得られるファイルサイズをさまざまな方法で最適化できますが、サイズを減らして色数を減らしました。魅力のように働いた:
gifsicle --resize 48x48 --colors 16 original.gif > smaller.gif
-coalesce
「各ポイントでアニメーションの完全なビューを作成します。アニメーションシーケンスではなく、実際のフィルムストリップのようなものです。CoalescedAnimationとして知られるこのようなシーケンスは、研究、編集、修正、再最適化がはるかに簡単です」