web-dev-qa-db-ja.com

ImageMagickを使用してアニメーションGIFファイルのサイズを変更するにはどうすればよいですか?

このようなアニメーションGIFファイルのサイズを変更したいdo.gif enter image description here

convert do.gif -resize 24x24\! do-24.gifを実行すると、do-24.gifでサイズ変更されますが、アニメーション化されません enter image description here

同じアニメーションを取得する正しい方法でサイズを変更する方法は?

45
zuba

ファーストラン:

convert do.gif -coalesce temporary.gif

それから

convert -size <original size> temporary.gif -resize 24x24 smaller.gif
55
phipsalabim

私はそれに慣れているためimagemagickソリューションを探していましたが、最終的に@samのgifsiclehttps://www.lcdf.org/gifsicle/ )の提案に行きました。 。それはちょうど私が望んだことをした、手間をかけなかった。

結果として得られるファイルサイズを非常に多くの異なる方法で最適化できますが、サイズを減らして色数を減らしました。魅力のように働いた:

gifsicle --resize 48x48 --colors 16 original.gif > smaller.gif

3
Peter Perháč

-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

enter image description here

out-coalesce.gif

enter image description here

out-deconstruct.gif

enter image description here

最初に、ファイルout-convert.gifの入力方法を確認します。これは、フレーム2がオフセット516x516でのみ252+257であるのに対し、フルサイズのフレーム1は1024x1024であるためです。

次に、3つのコンバージョンを比較すると:

  • out.gif:すべてのフレームは256x256以上であり、約5MiBで巨大です、どうしてですか?

    およそ256x256フレームにはゼロ以外のオフセットがあるため、視覚的には正しくありません。フレーム2の125+128

  • 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でテスト済み。