ImageMagickを使用して、pngのコレクションを1つのgifに変換しています。このgifをできるだけ早くループさせたい。
これは私が期待する出力とほぼ同じです( Wikipedia の厚意による):
これは私が実際に得る出力です:
私のブラウザー(Firefox 17)では、予想されるgifは実際のgifの2倍以上の速度で実行されます。各フレームの遅延を0にするように指定したので、これは私を驚かせます。
まず、ウィキペディアから借りたgifを分解して36のpngを作成しました。
--caution: command generates 36 pngs
convert.exe newton.gif newton_%d.png
次に、coalesce
を使用してpngを1つのgifに再結合しました。
convert.exe -dispose none -delay 0 newton_%d.png[0-35] -coalesce output.gif
identify
は、各フレームに遅延がないことを確認します。
identify.exe -format "%T, " output.gif
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
これは、実際には、オリジナルよりも遅延が少ないです。
identify.exe -format "%T, " newton.gif
5, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2,
実際のgifは、予想されるgifよりも遅延が少ないです。 では、予想されるgifが実際のgifの2倍の速度であるのはなぜですか?
私は実験して10ms(遅延= 1)バージョンを作成しました。
Gifをレンダリングするプログラムは、100分の1秒の遅延率を守らない傾向があるようです。 代わりに、選択した小さな値よりもはるかに大きな値を使用します。
彼らがこれを行う理由については、私は本当にコメントすることはできません。私は複数の理由に出くわしました、そしてそれはすべての推測である可能性があります。
一般に、すべてのケースで少なくとも200秒の遅延を使用することをお勧めします。
ソース(これには複数の理由があると思われる方法を示します。比較的古いものもあります):
@DavidMahが正しいようです。私のLinuxシステムでは、最小遅延は0.5です。
convert -dispose none -delay 0.4 newton_%d.png[0-35] -coalesce output0.4.gif
convert -dispose none -delay 0.5 newton_%d.png[0-35] -coalesce output0.5.gif
convert -dispose none -delay 1 newton_%d.png[0-35] -coalesce output1.gif
何らかの理由で、ブラウザに画像が正しく表示されないようです。ローカル画像ビューア(eom
)を使用すると、最初の画像は元の質問の画像と同じくらい遅く、他の両方はウィキペディアの画像より高速です。それは私のブラウザに固有の問題である場合に備えて私はとにかく投稿しています。いずれにしても、上記のコマンドを試してみると、速度が向上するはずです。
更新:2つの問題があるようです。ブラウザ(少なくともyのFirefoxおよびLinuxで実行されているchromium)は、1.5未満の遅延で作成されたgifを表示できません。 1.5は問題なく動作し、1.4は低速です。私の画像ビューアは0.5以上の遅延に対応できます。上記の画像のいずれかをダウンロードして、お気に入りの画像ビューアで開いてみてください。また、これらを見てください:
convert -dispose none -delay 1.4 newton_%d.png[0-35] -coalesce output1.4.gif
convert -dispose none -delay 1.5 newton_%d.png[0-35] -coalesce output1.5.gif
UPDATE2:@DavidMahは、10進値が最も近い整数に丸められることを以下のコメントで指摘しています。したがって、1.4は1に丸められて遅くなり、1.5は2に丸められて問題ありません。
私はXxY
遅延表記法を使用してより多くの成功を収めてきました。基本的にx
は/
に似ているため、-delay 1x20
を指定すると、フレームは1に対して表示されます/ 20秒。