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


33

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

これはおおよそ予想される出力です(ウィキペディアの提供):

期待される出力

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

実際の出力

私のブラウザ(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倍速いのでしょうか?


1
好奇心から、遅延を0ではなく1に設定するとどうなりますか?
mgilson

1
フレームレートの問題のようです。
SnakeDoc

@mgilson、私はそれを試しました。0遅延画像と1遅延画像は完全に同期しているように見えます。これは奇妙なことです。1遅延の画像はループごとに36/100秒遅れているためです。
ケビン

1
この質問のtl; dr:を使用し-delay 2ます。
マットM. 14

回答:


17

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

10ms遅延の例

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

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

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

ソース(これには複数の理由があるように見えることを示します。いくつかは比較的古いです):


1
レンダリングプログラムが速すぎるすべてのgifを遅くする場合、Wikipediaのgifは自分のgifと同じくらい遅くなります。しかし、そうではありません。なぜウィキペディアは速度制限を破ることができ、私はできないのですか?
ケビン

2
@Kevin:速すぎるGIFはすべて遅くなります。GIFが速すぎます。ウィキペディアのGIFは速すぎません。「速すぎ」ないように、速度を落とす必要があります。
デビッドシュワルツ

Wikipedia gifのフレーム遅延は20ミリ秒から50ミリ秒の範囲です。独自のフレーム遅延を20ミリ秒に設定すると、理論的にはウィキペディアgifと同じ「速すぎない」基準を満たしていますが、それでもなお遅くなります。
ケビン

2
20ミリ秒の遅延があるウィキペディアの画像と一緒に、20ミリ秒の遅延で作成したgifを含めた場合は、見てみましょう。
デビッド・マー

2
間違えました。20ミリ秒は、GIF WikipediaのGIF限り速く確かに私が作成されます。
ケビン

18

@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で実行されているクロム)は、遅延<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

ここに画像の説明を入力してください

更新2:@DavidMahは、以下のコメントで、小数値が最も近い整数に丸められることを指摘しています。したがって、1.4は1に丸められますが、速度は遅すぎますが、1.5は2に丸められます(OKです)。


7
遅延を10進数値に割り当てようとすることに注意してください。遅延は2バイトで格納され(これは、最大フレーム遅延が655360msであることを意味します)、符号なし整数です。Convertは、値を最も近い整数に丸めます。en.wikipedia.org/wiki/Graphics_Interchange_Format#Animated_GIF
デビッドマー

3
@DavidMahああ、それは理にかなっています。1.5は2に丸められるため機能しますが、1.4は1に丸められるため機能しません。
terdon13年

6

XxY遅延表記を使用して成功しました。基本的にxはのようなものな/ので、を指定する-delay 1x20と、フレームは1/20秒間表示されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.