web-dev-qa-db-ja.com

作成したgifが遅いのはなぜですか?

ImageMagickを使用して、pngのコレクションを1つのgifに変換しています。このgifをできるだけ早くループさせたい。

これは私が期待する出力とほぼ同じです( Wikipedia の厚意による):

expected output

これは私が実際に得る出力です:

actual output

私のブラウザー(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倍の速度であるのはなぜですか?

34
Kevin

私は実験して10ms(遅延= 1)バージョンを作成しました。

10ms delay example

Gifをレンダリングするプログラムは、100分の1秒の遅延率を守らない傾向があるようです。 代わりに、選択した小さな値よりもはるかに大きな値を使用します。

彼らがこれを行う理由については、私は本当にコメントすることはできません。私は複数の理由に出くわしました、そしてそれはすべての推測である可能性があります。

一般に、すべてのケースで少なくとも200秒の遅延を使用することをお勧めします。

ソース(これには複数の理由があると思われる方法を示します。比較的古いものもあります):

17
David Mah

@DavidMahが正しいようです。私のLinuxシステムでは、最小遅延は0.5です。

convert -dispose none -delay 0.4 newton_%d.png[0-35] -coalesce output0.4.gif

enter image description here

convert -dispose none -delay 0.5 newton_%d.png[0-35] -coalesce output0.5.gif

enter image description here

convert -dispose none -delay 1 newton_%d.png[0-35] -coalesce output1.gif

enter image description here

何らかの理由で、ブラウザに画像が正しく表示されないようです。ローカル画像ビューア(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

enter image description here

convert -dispose none -delay 1.5 newton_%d.png[0-35] -coalesce output1.5.gif

enter image description here

UPDATE2:@DavidMahは、10進値が最も近い整数に丸められることを以下のコメントで指摘しています。したがって、1.4は1に丸められて遅くなり、1.5は2に丸められて問題ありません。

18
terdon

私はXxY遅延表記法を使用してより多くの成功を収めてきました。基本的にx/に似ているため、-delay 1x20を指定すると、フレームは1に対して表示されます/ 20秒。

6
kralyk