web-dev-qa-db-ja.com

アニメーションGIFを並べて表示

Imagemagic/montageを使用してループアニメーションGIF(アニメーション化されていないGIFと混合)を並べて表示する方法はありますか?

つまり、時間ではなく空間でアニメーションを連結したいのです。アニメーションのフレーム数とその長さにより、2つのアニメーションをきちんと組み合わせることができない場合があることを認識しています。しかし、すべてのフレームが何らかの形で存在する限り、プログラムが近似と推測を行い、フレームを拡張/繰り返しすることは問題ありません。

私はもう試した

convert *.gif -append output.gif

そして

montage *.gif -mode concatenate -tile x1 output.gif

ただし、これらは両方とも、アニメーションGIFを複数の個別の非アニメーションGIFとして扱います。

おそらく、アニメーション化されたものをフレームごとに分割し、必要に応じて短いループを繰り返し/延長して最長のループに一致させるスクリプトを作成し、アニメーション化されていないgifを、アニメーション化された最長のフレームに含まれる数だけ繰り返し、対応するフレームをつなぎ合わせることができると思います。 -appendを使用して単一の大きなフレームに分割し、それらの大きなフレームを1つの大きなgifに結合します。しかし、これがいくつかの簡単なコマンドですでに可能である場合、私は車輪の再発明をしたくありません。

もちろん、imagemagick以外の無料オプションも利用できます。

10
tsbertalan

時間の経過とともに複数のアニメーションを一致させたいように思えますが、プログラムで各フレームとその遅延を読み取り、遅延が満たされるまで一定の頻度でそのフレームを出力します。例:1フレーム、1秒の遅延、「周波数」は100ミリ秒なので、100ミリ秒で10フレームを書き出す必要がありますか?そして、線形モンタージュに変換されますか?

そのような処理を実行するには、プログラムまたは大量のスクリプトが必要であり、「頻度」(ここでは100ミリ秒)を定義する必要があります。

しかし、これはうまく機能します:( gifsicleはパッケージであり、モンタージュはimagemagickパッケージの一部です)

gifsicle --unoptimize cool_animation.gif | \
  montage -tile x1 - linear_frames.png

(読みやすくするために改行)

最初の行は、着信gifを(stdoutへの)個々のフレームに分割しますが、レイヤーは塗りつぶされています。最初は、-unoptimizeオプションがないと、最初のフレームが表示されますが、後続のフレームには毎回変更されたものしか含まれていませんでした。奇妙なモンタージュのために作られました!

2行目は、線形出力を作成し、(stdinから)各フレームイメージを取得して、指定した順序で配置します。水平線に沿って配置するための「x1」。

単一のファイル名(cool_animation.gif)を複数、またはワイルドカード* .gifに置き換えることができます。

これがあなたが探しているものかどうかはわかりませんが。

1
lornix