ImageMagick の例 --
アニメーション基礎
- 目次
-
ImageMagick の例 序文と目次
-
GIF アニメーションとアニメーションメタデータ
-
フレーム破棄方法
-
アニメーションの調査
-
アニメーションの種類
-
ループの終わり - アニメーションが停止するタイミング
-
遅延ゼロの中間フレーム
GIF アニメーションとアニメーションメタデータ
ImageMagick が画像リストの出力を処理するデフォルトの方法は、複数ページの画像を生成することです。ただし、GIF 画像形式の場合、これは「GIF アニメーション」という特別な形式になります。
|
![]() |
star_field
」を使用する、より高度な「スパークル」の例を次に示します。このスクリプトは、ランダムな星野を生成する際の実験から開発されました。rose:
」に「スクリーン
」アルファ合成を使用して重ね合わせられ、指定された星のパターンで画像が明るくなります。その後、IM 汎用 GIF アニメーションオプティマイザによって処理されます。上記は、まだ紹介していない高度な IM 機能を使用しているため複雑に見えるかもしれませんが、結果は比較的シンプルですが、最適化された3フレームアニメーションです。歪みアニメーションのシンプルなシェルスクリプトを使用して作成された、より複雑なアニメーションのいくつかを見ることもできます。GIF アニメーションで使用するために特別に作成された IM 設定がいくつかあります。これらの設定について知ることが、GIF アニメーションの世界への第一歩です...-dispose {method} |
|||
GIF アニメーションの以前の結果で次の画像をどうするか。有効なオプションは、「未定義 」、「なし 」、「直前フレーム 」、および「背景 」です。(設定の説明については以下を参照してください) |
|||
-loop {number} |
GIF アニメーションが停止する前に画像シーケンスを循環する回数。これは出力の「画像書き込み」設定であるため、コマンドラインのどこにでも設定できますが、最後に設定された値のみが使用されます。通常、これはデフォルトでゼロ(無限ループ)に設定されていますが、読み込まれた画像に異なる値がある場合、この設定はその画像の値に設定されます。そのため、すべての画像が読み込まれた後、GIF アニメーションを作成するときは、常に「-loop 」を設定することをお勧めします。詳細については、以下のループの終わりを参照してください。 |
||
-delay {time} |
この設定が定義された後に読み込まれた、または作成された画像を描画した後、一時停止する時間遅延(1/100秒単位)を設定します。「x 」スケーリング(1秒あたりのティック数で指定)を指定することで、時間遅延に異なるスケールを指定できます。たとえば、「10x1 」は10、1秒ティックですが、「10x100 」は10、100分の1秒ティックです。基本的に、「x 」は分数「/ 」記号と同等です。たとえば、「1x160 」を指定すると、1秒あたり160フレームに適した遅延が設定されます。
|
||
-set dispose {method} |
|||
前のオプション設定は、新しく作成された画像、またはオプションが指定された後に読み込まれた画像に画像属性を設定しますが、「-set 」オプションは演算子であり、現在の画像シーケンスに既に存在するすべての画像に画像属性を設定できます。これにより、画像の読み込みまたは変更後に、アニメーション全体または単一フレームの設定を変更できます。 |
|||
-page {w}x{h}+{x}+{y} |
|||
これにより、読み込まれようとしている画像のオフセット位置を設定できます。これは設定オプションであるため、設定後に続く画像にのみ指定したジオメトリを適用します。既にメモリに読み込まれている画像には影響しません。 指定されていない場合、または「 x 」高さを指定することで、より大きな作業キャンバスを定義するためにも使用できます。シーケンスの最初の画像の幅と高さのページ設定のみが、GIF アニメーションのキャンバス全体のサイズを設定するために使用されます。アニメーションが最終的に書き込まれると、他のすべてのページサイズ設定は無視されます。GIF アニメーションが読み込まれると、キャンバスサイズはアニメーションのすべてのフレームに設定されます。MNG アニメーションはフレームオフセットを保存できますが、キャンバスサイズは保存しません。最初の画像のサイズがアニメーション全体のキャンバスサイズを定義します。
|
|||
-repage {w}x{h}+{x}+{y} |
|||
これは、設定ではなく画像演算子であることを除いて、「-page 」とまったく同じです。つまり、これを使用して、既にメモリに読み込まれている画像またはアニメーションフレームの「ページジオメトリ」を変更またはリセットできます。より単純な「+repage 」形式は、現在の画像シーケンスの各フレームのすべての画像の「ページジオメトリ」をゼロオフセットと画像の実際のサイズにリセットするだけです。この操作は、アニメーションから個々のフレームを抽出する場合に不可欠です(以下の分離の例を参照)。ただし、「+repage 」は各画像に保存されている多くの位置情報を破棄するため、後で再利用するためにこの情報を別のファイルに抽出する必要がある場合もあります。以下のアニメーションリスト情報を参照してください。 |
重要なポイント
処理が完了していない中間アニメーションを GIF に直接保存しないでください。一連の個別の処理ステップでアニメーションを操作する場合は、IM 内部形式 MIFF を一時ファイル形式として使用できます。繰り返しますが...
GIF を中間ファイル形式として使用せず、代わりに MIFF を使用してください
GIF に保存するという大きなミスを犯した場合、IM は色の数を減らすために自動的に色量子化を実行するため、結果のアニメーションは悪化します。それだけでなく、各フレームで他のすべてのフレームとは完全に独立して実行されるため、さらなる処理、特に GIF の最適化が非常に難しくなります。これを解決するには、複雑な多層問題であり、次のセクションアニメーションの最適化で検討します。フレーム破棄方法
GIFアニメーションを作成する人が最初に苦労するのは、"-dispose
" 設定です。これは複雑な設定なので、驚くことではありません。さらに悪いことに、多くのWebブラウザを含む多くのアニメーションプログラムは、GIFの破棄メタデータ設定を常に正しく処理するわけではありません。しかし、適切な破棄方法を使用することで、アニメーションの動作と最適化に大きな違いが生じます。ImageMagickで最初に覚えておくべきことは、ほとんどすべての特別なアニメーションオプションは、画像の読み込み設定であるということです。つまり、設定が行われた後に読み込まれた画像に適用されます。"-loop
" 設定は、アニメーションが完了した後、アニメーションが保存される直前に使用される唯一の設定です。"-dispose
" の基本的なタスクは、画像が "-delay
" 時間表示された後に、どのように削除されるかを定義します。つまり、フレームの画像を読み込む前に、画像の "-dispose
" と "-delay
" 設定を行う必要があります。しかし、アクションは、その画像が表示された後に適用されます。これは少し直感的ではありませんが、IMが画像を操作する方法としては理にかなっています。これを覚えていれば、問題はないはずです。IMの他のほとんどの設定と同様に、これらのオプションの「プラス」形式は、読み込まれる画像に設定が適用されないようにします。つまり、設定を指定しないと、フレーム画像は、画像とともに読み込まれた設定(存在する場合)を引き続き使用します。これは、後でGIFアニメーションを読み込んでさらに処理する場合、またはあるGIFアニメーションを別のGIFアニメーションにマージする場合(最も難しいアニメーション手法)に重要になります。破棄方法:なし- 各フレームが順番にオーバーレイされる
GIFアニメーションのデフォルトの "-dispose
" 設定は 'Undefined
' で、ほとんどのアニメーションプログラムは 'None
' 破棄設定と同じように扱います。基本的には、この特定のフレームによってオーバーレイされたものをそのまま残すようにコンピュータに指示します。より正確には、「何もしない」です。ただし、アニメーションシーケンスの最後に、ループして繰り返される前に、キャンバス全体が常にクリアされることに注意してください。標準的な「破棄なし」アニメーションの例を次に示します...
|
![]() |
|
![]() |
破棄方法:前フレーム- 背景キャンバスを保持する
'Previous
' 破棄方法は比較的単純です。現在の画像が終了したら、画像がオーバーレイされる前の状態にキャンバスを戻します。前のフレーム画像も「前フレーム」破棄方法を使用していた場合、結果は、そのフレームの前と同じになります...など...など...など...たとえば、このアニメーションでは、後の各フレームは、画像の最初のフレーム( 'None
' 破棄設定)に戻ってから、そのフレームに関連付けられた画像をオーバーレイします。その結果、各フレーム画像が、その画像の表示時間だけオーバーレイされた背景キャンバスになります...
|
![]() |
-dispose
" メソッド 'None
' に注意してください。これが重要です。そうでないと、「前フレーム」は、最初のフレームの前に存在していた元の空のキャンバスまでずっと戻ってしまいます。また、上記のアニメーションでは "-delay
" に '0
' を使用しました。これは、この「背景キャンバス」に最初のフレームをオーバーレイする前に待機しないことを意味します。これがなければ、上に何もないキャンバス画像だけが表示される短い遅延が発生します。もちろん、後の画像には、より長い "-delay
" を設定する必要があります。そうでないと、画像が一瞬で表示されて消えてしまい、ついでにビューアのCPUサイクルを大量に消費してしまいます。「前フレーム」破棄方法を使用すると、一部のWebブラウザ、特に低速なマシンでは、わずかなちらつきや一時停止が発生しやすいです。最近はめったに見られませんが、ちらつき自体は依然として存在し、バグだと考えています。詳細については、以下の遅延ゼロフレームを参照してください。「前フレーム」破棄スタイルのアニメーションを使用するアニメーションはほとんどありません。その理由は、コンピューターが最適化するのが非常に難しいからです。問題は、コンピューターが背景画像として選択するフレームはどれかということです。最適な画像を理解するのは人間にとっては簡単ですが、コンピューターが決定するのは困難です。アニメーションで使用するのに最適な背景画像は、現在の例のように、表示されない場合があり、そのため、そのアニメーションの最適化されていないバージョンには存在しない可能性があります。破棄方法:背景- 背景をクリアする
最初の2つの "-dispose
" メソッドは比較的単純ですが、 'Background
' はおそらく最も理解しにくいものです。特定のフレームの遅延時間が終了すると、そのフレームによってオーバーレイされた領域がクリアされます。キャンバス全体ではなく、オーバーレイされた領域だけです。それが完了すると、結果のキャンバスがアニメーションの次のフレームに渡され、そのフレームの画像によってオーバーレイされます。たとえば、ここでは各フレームを次のフレームに置き換えます。
|
![]() |
|
![]() |
Previous
' を使用して、それらのピクセルがクリアだったフレームに戻る方法です。しかし、これはアニメーションシーケンスの履歴を知っている必要があるため、コンピューターが最適化するのがはるかに難しくなります。![]() ![]() |
オーバーレイされた領域を透明色にクリアするのではなく、この破棄は、GIFアニメーションに格納されている「背景」色メタデータ設定にクリアする必要があるという考え方があります。実際、古い "Netscape " ブラウザ(バージョン2および3)はまさにそれを行いました。しかし、 'Previous ' 破棄メソッドも正しく実装できませんでした。一方、初期キャンバスもフォーマットの「背景」色から設定する必要がありますが、それも行われていません。ただし、最新のWebブラウザはすべて、最後にオーバーレイされた領域だけを透明にクリアするため、これは現在、受け入れられている慣習であり、IMが現在従っているものです。 |
![]() ![]() |
IMバージョン6.2.6-1より前では、IM "-coalesce " および "-deconstruct " 操作は、すべての主要なWebブラウザと同様に、ピクセルを透明にするために「背景」破棄を使用したアニメーションを処理しませんでした。例と詳細については、アニメーションのバグを参照してください。ただし、これらの関数は、ピクセルのクリアが適用または意図されていない場合は正常に機能しました。これは現在 " -coalesce " で修正されており、 "-layers OptimizeFrame ' メソッドは、GIFアニメーションフレーム最適化関数として "-deconstruct " の使用を置き換えるために作成されました。 |
アニメーションの研究
GIFアニメーションの基本、種類、最適化、および処理手法について説明を続ける前に、既存のアニメーションを研究するためのいくつかの手法が必要です。識別- アニメーションに関する情報
アニメーションは、個々のフレームに多くの情報が詰め込まれています。デフォルトのIM "identify
" コマンドを使用して、この情報の一部を確認できます。
![]() ![]() |
上記のような出力が表示されない場合、IMは少し古いため、インストールされているImageMagickのバージョンを最新バージョンにアップグレードする必要があります。そうしないと、IMのGIFアニメーションの処理と制御における多くの新しい進歩を見逃してしまいます。 |
結合- アニメーションをフレームに分割する
上記で見たように、ImageMagickはデフォルトで、ファイル形式で許可されている場合、複数の画像を1つのファイルに保存しようとします。ただし、複数画像リストの書き込みで説明したように、IMでは "+adjoin
" 設定を使用して、各画像を個別の画像としてディスクに保存するように指示できます。たとえば、ここでは、GIFアニメーションの1つを読み込み、アニメーションシーケンスの個々のフレーム画像を出力します。上記の実際の画像を調べると、ほとんどのWebブラウザは、各サブフレームが表示される、より大きな100x100領域を表示しますが、実際には、ほとんどの画像は実際には32x32ピクセルにすぎません。前の「識別」コマンドで示したとおりです。つまり、ほとんどの領域は、画像の「ページジオメトリ」または「仮想キャンバス」と呼ばれる、何も描画されていないキャンバスにすぎません。アニメーションの最初の画像は、その大きな「キャンバス」を定義し、他のすべてのフレームはこの大きなキャンバス上の「オフセット」位置を定義します。この追加情報は、 "+adjoin
" 設定で保存されたフレームに保持されます。そのため、GIFアニメーションを簡単に再構築できます。ページ情報は各フレーム画像に保持されるだけでなく、遅延、ループ、GIF破棄設定も保持されます。
これは、アニメーションを再構築するために、すべての画像を読み込むだけでよいことを意味します。
|
![]() |
+repage
" オプションを使用して、ページサイズとオフセットをリセットします。通常、アニメーションのサブ画像を抽出する際には、編集や表示に干渉しないように、画像の遅延と破棄設定もリセットするのが一般的です。例えば、ここでは不要な仮想キャンバスとオフセットを削除し、タイミング遅延と破棄をリセットしています。もちろん、このメタデータを破棄する場合は、そのデータを記録および編集する方法が必要です。サブ画像を抽出し、アニメーションのメタデータをアニメーションの再構築に使用できる形式で保存するスクリプトについては、(下記の)アニメーションリスト情報を参照してください。
連結処理(Coalesce)- フレームを完全に塗りつぶす
ただし、典型的なアニメーションでは、サブフレームの形式でアニメーションを表示することは、通常あまり役に立ちません。まず、高度に最適化されたアニメーションは、どのように組み合わされるかを示す視覚的な指示なしに、非常に小さな部分が多く含まれている可能性があります。また、アニメーションの全体的なファイルサイズを削減するために圧縮最適化のために追加された、多くの「ノイズ」が含まれている可能性もあります。たとえば、アニメーションの個々のサブフレームを見るだけでは、このアニメーションが実際には何を行っていたのかを理解することは非常に困難です。"-coalesce
"操作は、基本的に、前のフレームが正しく破棄され、次のサブフレームがオーバーレイされた後、アニメーションがどのように見えるべきかを正確に画像に変換します。つまり、各フレームが前の「破棄」されたフレームへのオーバーレイされた変更のみを表すアニメーションシーケンスの代わりに、この演算子は、各ポイントでのアニメーションの完全なビューを作成します。アニメーションシーケンスではなく、真のフィルムストリップのようなものです。連結アニメーションと呼ばれるこのようなシーケンスは、研究、編集、変更、再最適化がはるかに容易です。たとえば、ここで、上記で示したのと同じ「混乱させる」アニメーションシーケンスのモンタージュを生成しますが、今回はシーケンスを"-coalesce
"して、実際に何が起こっているかを確認できるようにします。
|
![]() |
magick montage
"コマンドは"-coalesce
"の使用を理解しており、上記のようにアニメーションフレームの「フィルムストリップ」のような画像を作成できます。このバージョンには、連結処理の修正も含まれており、GIFアニメーションの作業は少なくともこのバージョン(またはできれば最新バージョン)である必要があります。![]() ![]() |
アニメーションを調べるためのさらに優れたモンタージュ手法は、次の例のセクションで示されています。 |
-dispose
"設定は実際には無関係です。ただし、ユーザーの安心のために、"-coalesce
"演算子は、各フレームの"-dispose
"設定を必要に応じて「なし
」または「背景
」に設定するため、連結画像シーケンスは(上記のように)正しくアニメーション化され続けます。![]() ![]() |
「背景 」破棄のフレームは、次のフレームを正しく表示するために、少なくとも1つ以上のピクセルをクリアする必要があることを意味します。そのため、" -coalesce "が「背景 」破棄を追加したアニメーションは、単純なオーバーレイアニメーション(下記参照)として保存できないことを意味します。技術的には、連結画像シーケンスのすべての破棄設定を「 背景 」または「前 」に設定して、クリアフレームアニメーション(下記参照)を生成できます。ただし、すべてのアニメーションがその形式でうまく最適化されるわけではありません。 |
-coalesce
"演算子のアニメーション以外の用途もあります。これらの使用例については、連結処理とプログレッシブフラット化の例を参照してください。アニメーションフレームモンタージュ- "gif_anim_montage"スクリプト
"+adjoin
"演算子を使用すると、アニメーションから実際の画像を抽出し、"-coalesce
"を使用すると、アニメーションの結果のフレームを確認できますが、どちらの方法もアニメーションに関する多くの情報を省略します。アニメーション画像を非常に注意深く操作することで、実際のフレームだけでなく、それらのフレームがより大きなキャンバスに配置されている様子も表示するようにフレームを表示できます。アニメーションを表示するこのような方法の1つを次に示します。
magick -dispose Background script_k.gif -alpha set \ -compose Copy -bordercolor black -border 1x1 -compose Over \ -coalesce -bordercolor none -frame 4x4+2+2 \ -bordercolor none -border 2x2 +append script_k_parts.gif |
![[IM Output]](script_k_parts.gif)
gif_anim_montage
"に変換し、アニメーションの各フレームの上にいくつかの詳細をリストするように拡張しました。ペンがページから持ち上げられて再配置されているかのように一時停止するために、さまざまなフレームで使用されるタイミングのバリエーションに注意してください。タイミングが可変なアニメーションは最も興味深いもののいくつかですが、後のIMの例のページでわかるように、処理がより困難になる場合もあります。"gif_anim_montage
"スクリプトには、連結されたアニメーションの半透明のコピーを下敷きにする特別なオプション「-u
」もあります。これにより、新しいサブフレームが表示されたアニメーションをどのように変更するかを確認できます。もちろん、これには半透明のピクセルが含まれているため、「PNG」画像形式が必要でした。または、スクリプトが提供する多くの「背景」オプションの1つを使用して、結果のサマリー画像にGIFまたはJPEG形式を使用することもできます。アニメーションの。その他のオプションでは、使用する行数または列数を定義したり、さまざまな非透過的な背景を設定したり、デフォルトの黒ではなく赤いボックスを使用したりできます。このスクリプトは、IMの例の次の数ページで多く使用されます。ご意見やご感想をお待ちしております。アニメーションリスト情報- アニメーションの構築に使用されるオプション
前述したように、"+adjoin
"、"-coalesce
"、および"+repage
"を使用することは、GIFアニメーションを抽出して調べるためのすべて有用な方法です。ただし、これらの方法はすべて、その過程で元のアニメーションに関する情報を破棄します。フレーミング、時間遅延、フレーム破棄などに関するこの追加情報は、"-verbose
"オプションを指定したIM "magick identify
"コマンドを使用して確認できます。ただし、私、そしておそらく他のほとんどのユーザーは、このコマンドの出力が圧倒的で、実際には直接使用できないと感じています。ここで、私が書いた別の特別なシェルスクリプトが登場します。"gif2anim
"スクリプトは、アニメーションの個々のフレームを分離しますが、それらの画像からアニメーションを再構築するために必要なIM "magick
"オプションも正確に把握します。"gif2anim
"は、IMオプションの観点からアニメーションの概要を生成するアニメーション逆アセンブラと考えることができます。たとえば、使用してきたアニメーションの例をデコードして、作成に使用された元の"magick
"設定と使用された個々の画像を復元してみましょう...
|
![]() ![]() ![]() ![]() ![]() |
gif2anim
"スクリプトは、個々の画像と".anim
"オプションファイルに同じベースファイル名を使用します。そのため、上記のコマンドによって生成されたアニメーションシーケンスファイルの名前は"canvas_prev.anim
"で、個々のフレーム画像の名前は"canvas_prev_001.gif
"から"canvas_prev_005.gif
"です。結果をよく見ると、このGIFアニメーションを最初に作成したときに使用した元のオプションを実際に再作成できたことがわかります(前の破棄アニメーションを参照)。また、アニメーションの生成には実際には重要ではありませんが、オーバーレイされたフレームのサイズとタイミングもコメントとしてリストされているため、学習が容易になります。結果をファイルに保存するのではなく、"-l
"フラグを使用してアニメーションシーケンスオプションを画面にリストするだけです。つまり、アニメーションシーケンスファイルを保存したり、アニメーションの個々のフレーム画像を保存したりするのではなく、出力するだけです。
gif2anim -l canvas_prev.gif |
".anim "ファイルと個々のフレーミング画像が与えられると、補完的なスクリプト"anim2gif "を使用してアニメーションを再構築できます。
|
![]() |
anim2gif
"は、デフォルトでは、"_anim.gif
"サフィックスが付いたGIFアニメーションを再作成します。生成された"canvas_prev_anim.gif
"アニメーションが元のアニメーションとまったく同じように見え、動作することがわかります。このスクリプトは、"アニメーションシーケンスファイル"で使用されている特殊な文字列"BASENAME
"を置き換え、すべてのコメントを取り除き、残っている変換オプションを"magick
"コマンドに渡します。つまり、上記のファイルをコメント付きの「変換」スクリプトとして扱います。特別な文字列が使用された理由は、これにより、「.anim
」ファイル自体の名前とは異なるベースファイル名を指定できるようになるためです。そうすれば、元の変更バージョンなど、まったく異なるフレーム画像セットを使用して、古いアニメーションから異なるアニメーションを再作成できます。これは非常に便利な機能であり、より複雑なアニメーション処理で使用されます。(例については、アニメーションを横に並べて追加するを参照してください)。"gif2anim
"と同様に、"anim2gif
"スクリプトには、アニメーションの処理と変更に役立つ非常に多くの便利なオプションがあります。これらのオプションの一部は後でufabetされます。たとえば、アニメーションの追加を参照してください。また、".anim
"ファイルはプレーンテキストであるため、これを使用してアニメーションのデコードされた画像を取得し、タイミング、位置、アニメーションの繰り返しセクションなどのGIFのメタデータを調整したり、アニメーションに新しいフレームと画像を追加したりできます。結局のところ、これが私がIMの例に関わるずっと前にスクリプトを書いた理由です。今のところ、"gif2anim
"は、アニメーションシーケンスを調べて何が起こっているのか、そしてフレーム間に適用されているタイミングを確認するのに最も役立ちます。画像の破棄- フレームのGIF破棄形式
この特別な "-layers
" メソッド 'Dispose
' は、時間遅延が終了し、GIF dispose メソッドが適用された*後*、しかし次のフレーム画像が重ねられる*前*に、フレームがどのように見えるべきかを示します。言い換えれば、これはGIFの "-dispose
" メソッドの設定が実際にフレームに対して何をしているのかを正確に示し、アニメーションの何が問題なのかを正確に把握できるようにします。たとえば、3つのDispose メソッドのアニメーション例のそれぞれが、個々のフレームの dispose メソッドが適用された後にどのように見えるかを示します。これらのアニメーションはそれぞれ、'None
' の "-dispose
" 設定で設定された「キャンバス画像」で構成され、その後、4つの小さな画像が重ねられ、さまざまなGIF dispose メソッドによって破棄されます。'None
' dispose アニメーション...
magick canvas_none.gif -layers Dispose canvas_none_dispose.gif gif_anim_montage canvas_none_dispose.gif canvas_none_dispose_frames.gif |
![[IM Output]](canvas_none_dispose_frames.gif)
Previous
' dispose アニメーション...
magick canvas_prev.gif -layers Dispose canvas_prev_dispose.gif gif_anim_montage canvas_prev_dispose.gif canvas_prev_dispose_frames.gif |
![[IM Output]](canvas_prev_dispose_frames.gif)
Background
' dispose アニメーション...
magick canvas_bgnd.gif -layers Dispose canvas_bgnd_dispose.gif gif_anim_montage canvas_bgnd_dispose.gif canvas_bgnd_dispose_frames.gif |
![[IM Output]](canvas_bgnd_dispose_frames.gif)
None
' の dispose に設定されているため、変更されないことに注意してください。重要なのは、後のフレームにおける dispose メソッドの効果です。![]() ![]() |
"-layers Dispose " 操作は、破棄フレームの「連結」シーケンスのみを生成します。破棄設定自体はリセットされないため、結果が正しくアニメーション化されない場合があります。上記を正しくアニメーション化するには、すべての破棄方法を 'previous ' または 'background ' に設定するか、保存する前にアニメーションを最適化します。 |
![]() ![]() |
GIF dispose メソッド適用後の最後のフレームの外観は、通常、GIFアニメーションには関係ありません。アニメーションが繰り返される(ループする)前に、キャンバス全体が完全にクリアされるためです。アニメーションシーケンスの最後に「ループ」せずに停止する場合、最後のフレームの破棄は適用されません。 言い換えれば、上記に示されている最後のフレームの外観(破棄後)、または最後のフレームの実際の破棄設定は、GIFアニメーションには影響しません。IMは一般的に、フレームの最適化中に適切な破棄方法を決定しようとするときに、これを前のフレームと同じに設定します。 |
分解- フレームの差異領域を報告する
ImageMagickでアニメーションを最適化し、結果を小さくしてダウンロードとアニメーションを高速化する従来の方法は、 "-coalesce
" 形式を "-deconstruct
" することです。*これはもはや推奨されていません*。代わりに、汎用GIFオプティマイザを使用する必要があります。この演算子は、連結された画像シーケンス(表示時に実際に表示されるアニメーションフレーム)を取得し、2番目以降の画像を前の画像と比較します。次に、その画像を、変更されたピクセルの最小の矩形領域に置き換えます。色の変化(オーバーレイ)かクリア(消去)かに関係なく、ピクセルの変化はすべてカウントされます。これは非常にシンプルであり、典型的なオーバーレイアニメーションの場合、そのアニメーションに最適なフレーム最適化を生成します。ただし、オーバーレイアニメーションアニメーションは、'None
' dispose メソッドのみを使用します。たとえば、上記で生成した連結された前のアニメーション(たまたまオーバーレイアニメーションを形成する)を取得し、 "-deconstruct
" 演算子を実行してみましょう。
|
![]() |
|
![]() ![]() ![]() ![]() |
-deconstruct
" は、ある連結フレームから次のフレームに変更された領域を返しました。その結果、特別なdispose設定を必要としない、最適化されたオーバーレイアニメーションが得られます。これは、最初に手動で生成したアニメーションほど最適ではありませんが、それ自体で役立ちます。残念ながら、 "-deconstruct " は、GIFアニメーションの "-dispose " 設定をまったく理解していません。そのため、上記で作成した(左側に表示されている)'背景dispose' アニメーションなど、あるフレームから次のフレームにピクセルをクリアするアニメーションでこれを試みると、ひどい失敗に終わります。 |
![]() |
ここでは、表示されたばかりのアニメーションを取得し、 "-coalesce " および "-deconstruct " サイクルを実行します。
|
![]() |
-deconstruct
" は、アニメーションをゆっくりと破壊します。基本的に、 "-deconstruct
" は、画像レイヤー間の違いを見つけるように設計されています。アニメーションを正しく最適化するために設計されたものではなく、以前にオーバーレイされたピクセルをクリア(消去または透明にする)ためにさまざまな破棄手法を使用する必要があるアニメーションでは失敗します。フレーム比較- フレームのより詳細な比較
IM v6.2.6-2では、いくつかの追加のGIFフレーム比較メソッドが追加されました。これらは、アニメーションの適切な最適化のために内部的に必要でしたが、コマンドラインや他のAPIインターフェースで利用できるようにするのに十分役立つと見なされました。Compare_Any
"-layers
" メソッド 'CompareAny
' は、実際には "-deconstruct
" とまったく同じです。実際、 "-deconstruct
" 演算子は、'CompareAny
' メソッドの機能的なエイリアスにすぎません。繰り返しますが、'背景dispose' アニメーションの「分解」または「CompareAny
」の実際の画像結果を見てみましょう。
magick canvas_bgnd.gif -coalesce canvas_bgnd_coal.gif gif_anim_montage canvas_bgnd_coal.gif canvas_bgnd_coal_frames.gif magick canvas_bgnd_coal.gif -layers CompareAny magick compare_any.gif gif_anim_montage compare_any.gif compare_any_frames.gif |
![[IM Output]](canvas_bgnd_coal_frames.gif)


![[IM Output]](compare_any_frames.gif)
Compare_Clear
"-layers
" メソッド 'CompareClear
' は、あるフレームから次のフレームにクリアする必要があるすべてのピクセルを含む最小の矩形領域を表示します。
|
![[IM Output]](compare_clear_frames.gif)
-quiet
" 設定を使用して、IMにこの画像に関する警告を出さないように指示しました。後のすべてのフレームがすべて「欠落」画像になった場合、GIFアニメーションはピクセルをクリアせず、アニメーションはオーバーレイアニメーションとして分類できます。Compare_Overlay
最後の "-layers
" 比較メソッド 'CompareOverlay
' は、前のフレーム以降にオーバーレイされた(追加または色が変更されたが、クリアされていない)ピクセルの領域を返します。
magick canvas_bgnd_coal.gif -layers CompareOverlay magick compare_overlay.gif gif_anim_montage compare_overlay.gif compare_overlay_frames.gif |
![[IM Output]](compare_overlay_frames.gif)
![]() ![]() |
"-layers " 比較メソッドも "-deconstruct " 演算子も、画像のGIF dispose メソッドを調べたり変更したりしません。結果は単なる画像のリストであり、アニメーション自体として使用されることは想定されていません。 |
![]() ![]() |
これらの演算子は、連結された画像シーケンスで動作するように設計されていますが、エラーを生成せずに、連結されていない画像レイヤーのシーケンスを受け入れます。 この場合、フレームを比較する前に、各フレームは ' Copy ' アルファ合成メソッドを使用して前のオーバーレイされたフレームにオーバーレイされます。このアルファ合成メソッドにより、レイヤーの透明度も宛先画像に追加されます。これがなければ、上記は連結された画像シーケンスで透明度にクリアされるピクセルを見つけることができません。これは、 " -coalesce " 演算子がGIFアニメーションを表示するために必要な「dispose/overlay」サイクルの処理に使用する、より一般的な 'Over ' 合成メソッドとは異なることに注意してください。 |
アニメーションの種類
見つかるほとんどのGIFアニメーションは、いくつかの基本的なタイプのアニメーションに分類されます。これらのタイプについて知っていれば、アニメーションが1つのフレームから別のフレームにどのように表示されているかを理解し、アニメーションの処理方法と変更方法のショートカットを利用できます。連結アニメーション
「**連結アニメーション**」とは、基本的に、各「dispose/overlay」サイクル後にユーザーに表示されるはずのアニメーションの外観を示す画像シーケンスです。画像は基本的に、アニメーションの実際の「フィルムストリップ」を見ている場合に表示されるのと同じです。これは、あらゆるアニメーションの簡略化され、完全に最適化されていない形式です。この命名規則は、GIF破棄アニメーションを最適化されていない「連結アニメーション」に変換するために使用されるIM "-coalesce
" 演算子の名前から来ています。ほとんどのビデオ形式(MPEG、AVIなど)も、実際には本質的に「連結アニメーション」です。ただし、これらには透明ピクセルがない傾向があり、一般にアニメーションのフレーム間には一定の時間遅延があります。連結されたGIFアニメーションには透明ピクセルを含めることができ、時間遅延は即時の「0」遅延から非常に高速、または非常に非常に低速まで大きく異なります。連結されたアニメーションのGIF破棄設定には意味がありませんが、 "-coalesce
" 演算子は、結果の画像シーケンスが有効なGIFアニメーションとして機能するように破棄を適切に設定します。常に1つのフレームから次のフレームにすべてのピクセルを置き換えるビデオ形式は、一般に 'None
' または 'Undefined
' GIF破棄設定を使用できます。本質的に連結アニメーションでもあるアニメーションの例と、アニメーションの個々のフレームの "gif_anim_montage
" 表示を次に示します。
![]() |
![]() |
オーバーレイアニメーション
「オーバーレイアニメーション」とは、アニメーションの各フレームが、現在表示されているアニメーションに新しいピクセルをオーバーレイするだけのアニメーションです。つまり、アニメーションのどの時点でも、ピクセルを透明にクリアする必要がありません。個々のフレームは、背景として、または最適化の一部として透明度を含むことができますが、ピクセルを透明にクリアすることはありません。もちろん、透明度がまったく使用されていない場合、アニメーションは単純なオーバーレイアニメーションに変換できることが保証されます。これはおそらく最も単純なタイプのフレーム最適化アニメーションであり、クライアントによる特別な処理を必要としません。ユーザーに表示される各フレームは、以前のすべてのフレームの「フラット化」された画像として単純に見ることができます。「None
」GIF 処分方法のみを使用するアニメーションは、「オーバーレイアニメーション」です。たとえば、最後の例は「完全統合アニメーション」であるだけでなく、「オーバーレイアニメーション」でもあります。ただし、すべての「完全統合アニメーション」が「オーバーレイアニメーション」であるわけではありません。統合されたアニメーションで「CompareClear
」レイヤーメソッドを使用し、2 番目以降のすべての画像が「欠落画像」であるかどうかを確認することで、アニメーションがオーバーレイアニメーションになることができるかどうかをテストできます。つまり、あるフレームから次のフレームにピクセルをクリアまたは消去する必要はありませんでした。実際、アニメーションを修正せずにオーバーレイアニメーションにすることができる場合、IM「coalesce
」演算子はすべてのフレームに対して「None
」処分方法のみを使用します。そうでない場合、「coalesce
」は少なくとも一部のフレームに対して「Background
」処分を使用しています。これにより、「オーバーレイのみ」機能の別のテストが提供されます。オーバーレイアニメーションは透明度を使用できますが、透明な背景に可動部分はありません。たとえば、手書きの文字「K」のアニメーションは、各部分が透明な背景に既存の部分を追加または変更するだけなので、オーバーレイアニメーションです。結果の画像に新しい透明度を追加することはありません(最初のフレームの一部として追加する場合を除く)。
![]() |
![]() |
![[IM Output]](../images/dl_world_anim.gif)
もちろん、元の背景をオーバーレイすることで古い部分を「消去」する必要があるということは、オーバーレイされたサブ画像が一般的に大きく、したがってGIFアニメーションファイルサイズが一般的に大きくなることを意味します。残念ながら、IMのフレームの最適化演算子を使用すると、「統合オーバーレイアニメーション」が「オーバーレイアニメーション」ではないものに変換される可能性があり、おそらく変換されます。これは、より小さなGIFファイルサイズを見つけるためです。ただし、フレームの最適化を使用する代わりに、アニメーションで分解を使用することにより、アニメーションが単純な「オーバーレイアニメーション」のままになるようにすることができますが、アニメーションが実際に「オーバーレイアニメーション」である場合に限ります。アニメーションが「オーバーレイアニメーション」でない場合、分解操作がうまくいかない可能性があります(上記の分解を参照)。人間のスキルがあれば、たとえばフレーム更新の分割を使用し、アニメーションの「オーバーレイのみ」要件を損なうことなく、何らかの形式の圧縮最適化を適用することで、オーバーレイアニメーションをより適切に最適化できます。通常、「オーバーレイアニメーション」は透明度をまったく表示しません(最適化の一部として使用できますが、表示しません)。また、透明度が表示されない場合、アニメーションは「オーバーレイアニメーション」であることが保証されます。「オーバーレイアニメーション」がそれほど重要であるのはなぜですか?このタイプのアニメーションに限定されているソフトウェアがあるからです。透明度を処理したり、前のフレームを保存してGIF処分方法を処理したりする必要がないため、オーバーレイのみが実行されるため、処理がはるかに簡単になります。このようなソフトウェアはまれですが、存在します。
フレームクリアアニメーション
アニメーションが「Previous」または「Background」GIF 処分のみを使用する場合、非常に特殊なタイプのアニメーションが得られます。「Background」処分のみが使用される場合、アニメーションのすべてのフレームが表示され、次のフレームが表示される前にクリアされることに注意してください。また、「Previous
」のみが使用される場合、アニメーションは常に次のフレームが表示される前に初期のクリアされたキャンバスに戻り、同じ効果が得られます。これらの2つの処分設定の組み合わせのみを使用した場合も同じことが起こります。つまり、これらの処分方法のみを使用するアニメーションには、その時点でユーザーに表示されるものの完全なコピーであるフレームが含まれます。つまり、アニメーションが「完全統合アニメーション」であるとは言えません。サブフレームはアニメーションの仮想キャンバス領域よりもはるかに小さい場合がありますが、そのフレームの外側のすべては透明(または背景)と見なされ、重要なものは何も含まれていません。たとえば、この走るウサギのアニメーションを見てください...
![]() |
![]() |
Previous
」に設定されていることに注意してください。これは、以下で説明する理由により、使用するのにより論理的な処分設定です。ただし、すべての処分設定は、最終結果を変更せずに「Background
」処分または2つの組み合わせに設定できます。より良い名前がないため、このようなアニメーションを「クリアフレームアニメーション」と呼びますが、「Previous または Background 処分アニメーション」と呼ばれることもあります。アニメーションがこのタイプではない唯一の時は、アニメーション内の少なくとも1つの空白以外のフレームが「None
」または「Undefined
」(同じもの)処分方法を使用した場合です。このアニメーションは非常に特殊です。オーバーレイアニメーションとは異なり、アニメーションシーケンス内のどこにでも、任意の量の透明度のクリアを処理できるためです。しかし、それはまた、どんな静的な背景画像にも本当に素早くオーバーレイすることができます。これを行うには、「クリアフレームアニメーション」の定義を少し厳しくする必要があります。具体的には、すべての処分が「Previous
」に設定されていることを確認する必要があります(これは既に例の場合です)。それが行われたら、背景に下線を引くために画像(遅延ゼロ)をプリペンドするだけです。たとえば、ウサギを草の上に置いてみましょう....
|
![]() |
Previous
」処分がクリアフレームアニメーションの推奨処分である理由でもあります。GIFアニメーションの特別なサブセットにすぎないオーバーレイアニメーションとは異なり、すべてのアニメーションはクリアフレームアニメーションとして保存できます。アニメーションを統合し、オプションで周囲の透明なエッジをトリミングしてフレームを最適化し、処分をリセットするだけです。
magick any_animation.gif -coalesce -trim \ -set dispose previous cleared_frame_animation.gif |
その背景でアニメーションの位置を変更することもできます...
|
![]() |
ただし、GIFアニメーションにこのように背景を追加することには問題があります。前の例を見ると、おそらく高速で移動するアニメーションに大きな邪魔な一時停止があることに気付くでしょう。つまり、アニメーションがループされ、背景画像が再ロードされると、ウサギは一瞬消えました。(遅延ゼロのフレームの注記を参照)ただし、これは、表示オブジェクトにアニメーションシンボルを追加するためにこの手法を使用するアプリケーションでは問題ありません。とにかく、その「中間」フレームは表示されないためです。そのため、GIFアニメーションに透明でない背景を追加する場合は、通常、単純なクリアフレームアニメーションをオーバーレイアニメーションに変換することをお勧めします。つまり、初期キャンバスを与えるのではなく、アニメーションのすべてのフレームにその背景を追加します。これを行うには、上記のアニメーションを統合してから遅延ゼロの背景フレームを削除するか、元のアニメーションを静的背景にレイヤー合成します。例えば...
|
![]() |
![[IM Output]](bunny_bgnd_frames.gif)
![]() ![]() |
IMフォーラムメンバーのel_supremo、Peteは、MagickWandと同等のスクリプトであるクリアフレームを背景に配置する例を提供しています。 この例については、IMフォーラムのMagickWandでクリアフレームGIFアニメーションを作成するでも詳しく説明しています。 |
混合破棄アニメーション- 複数背景アニメーション
単一のGIFアニメーションで様々な廃棄方法を混在させることを妨げるものはありません。実際、クリアフレームアニメーションに背景を追加することは、まさにそれを実行しています。廃棄方法の混在は人間にとってはそれほど単純ではありませんが、そうすることで非常に複雑なアニメーション表示を生成できます。一般的に、これらは特定のアニメーションの自動フレーム最適化の一部として作成されます。ただし、結果は特定の目的のために以前のアニメーションタイプとして直接使用できるわけではないことを覚えておいてください。実際、一部のGIF処理プログラムが「混合廃棄アニメーション」を正しく処理できない場合でも、驚かないでください。これには、利用可能なGIFオプティマイザの一部も含まれます。 「混合廃棄アニメーション」の典型的な例は、アニメーションの背景に半永久的ではあるが一時的に静的な変化を引き起こす小さな移動オブジェクトです。ボールがレバーに当たることがその一例です。Simple Example wanted同様に、大きな透明なディスプレイ上の2つの非常に小さな移動オブジェクトを含むアニメーションは、廃棄技術を混在させることによってのみ最適化できます。これにより、各オブジェクトは別々のアニメーションフレームを使用して移動されます。
FUTURE, A more complex animation for study. * Start with a semi-transparent canvas * run a little 'previous' disposal * leave one frame as a new 'canvas' * more previous animations * erase that 'addition' using a 'background' disposal set as new canvas * continue back to start point. This animation should thoroughly test out not only IM disposal methods but also various browser disposal methods.このようなアニメーションのIMの例を提供したい場合は、ここにあなたの名前とホームページへのリンクを掲載できます!
ループの終わり- アニメーションが停止した場合
アニメーションがアニメーション化されている間、クライアントマシンは継続的に動作する必要があるため、アニメーションを永遠にループさせないことは良い考えだとしばしば考えられています。そのため、アニメーションが実際に何回ループするかを考えることをお勧めします。基本的には..
アニメーションにループ制限を追加する(可能な場合)
これは、Webページの上部にロゴとして使用される大きなアニメーションの場合に特に当てはまります。アニメーションの実行時間全体に応じて、大きなロゴの場合は通常10〜30ループで十分です。そして、ユーザーに配慮するために、そのようなすべてのアニメーションにループ制限を追加する必要があります。"-loop
" 保存設定が0の場合、永遠にループすることを意味します。これは通常使用される方法であり、小さなアニメーションの場合は問題ありません。ただし、一部のブラウザは、アニメーションが内部ループ制限(多くの場合256ループ)に達すると強制的に停止します。IMの例では、一般的に「0」の "-loop
" 保存設定を使用しています。これは「永遠にループする」ことを意味します。これは、アニメーションがページのどこにでも表示される可能性があるためです。つまり、ユーザーがページを読み込んでから、特定のGIFアニメーションを見て読むまでに、しばらく時間がかかる場合があります。「ループ」の数を少なくすると、アニメーションは本来の動作をしなくなり、効果が失われます。トップレベルのフラッシュページの大きなアニメーションの場合、"-loop
" を「1」(通常のGIFアニメーションのデフォルト)にすることができます。これは、アニメーションを1回だけ実行して停止することを意味します。これは、非常に重要な質問につながります.. **どこで停止しますか?** 古い "Netscape
" ブラウザなどの一部のブラウザは、アニメーションの最初のフレームを再表示しました。ただし、最新のほとんどのブラウザは、最後のフレームで停止し、そのフレームの役に立たない dispose 設定を無視します。ただし、特定のアプリケーションが何をするかは、真の標準がないため、アプリケーション次第です。実際、「ループ」メタデータの使用自体も非標準であり、古い "Netscape
" ブラウザが実装し、後のすべてのブラウザがコピーしたものです。このため、アニメーションを停止させたい特定のフレーム(たとえば、会社名またはロゴが表示されているフレーム)がある場合は、そのフレームをアニメーションの最初と最後のフレームの両方にすることをお勧めします。ただし、これらのフレームのいずれかには、「ゼロ遅延」を指定して、アニメーションのループ時間全体の長さに影響を与えないようにする必要があります。要約すると...
ループが制限されている場合は、「停止」フレームを最初と最後の両方のフレームに追加します。
ゼロ遅延中間フレーム
クリアフレームアニメーションに関して、「ゼロ遅延」のフレームの使用をすでに見てきました。以前および背景の廃棄の説明にも使用しました。これらの特別なフレームは、実際には人々が考えるよりもはるかに一般的です。それらは、アニメーションに背景の「キャンバス」を付加する方法(上記で使用した方法など)を表すだけではありません。しかし、それらはまた、フレームの2倍化やフレーム更新の分割など、より複雑なフレーム最適化技術には必須です。別の(非常に古いPNG以前のフォーマット)使用法は、256色制限を超える静的GIF画像を作成できるようにすることでした!つまり、各フレームは256色を提供し、次のフレームは次の256色のセットを提供し、すべてゼロ遅延で、最後にループはありません。この指摘をしてくれたのは、TLULによる議論量子化されていないGIFの作成です。これらの「_ゼロ遅延中間フレーム_」は、ユーザーに表示するためのものではありません。それらは、GIF画像で、そうでなければ不可能な、またはそれらなしで得られるよりも最適化された特殊効果を作成するためにのみ使用されます。要約すると...
ゼロ遅延フレームは中間フレームです。
ユーザーに表示するためのものではありません。
ImageMagickは、自動「OptimizePlus」の一部としてアニメーションにこのようなフレームを作成するだけでなく、「RemoveZero」レイヤーメソッドを使用してそれらを削除する方法も提供します。アニメーションの処理を複雑にすることが多いため、注意してください。わかりました、それらは重要です、それで?多くのアプリケーションがそれらを好まない、または正しく処理しないためです。何らかの理由でアニメーションに意図的に追加した場合でも、「ゼロ遅延フレーム」を悪いものと見なします。私が知っている、または聞いたことがあるアプリケーションの概要を以下に示します。「間違ったことをする」...ユーザーに表示するためのものではありません。
Gimp | 「ゼロ遅延フレーム」を保存しません。常にゼロ時間遅延のフレームに最小時間遅延を追加します。 :-( |
FireFox | そのようなフレームでわずかにゼロ以外のポーズを与えます。これはおそらく、時間遅延のないアニメーションがコンピューターのCPUサイクルをすべて使い尽ないようにするためです。しかし、アニメーションの全体的な表示時間がゼロ以外の場合でも、 "firefox " はその制限を緩和しません。 |
Internet Explorer | 最小時間遅延は6センチ秒であり、これより小さい遅延は無視されます。Internet Explorerバージョン8も、画像フレームが最初のフレームによって設定されたアニメーション境界を超えると失敗します(すぐにループを再開します)。これは大きなバグだと思います。 |
「遅延」のないGIF(ループ)アニメーションを保存しないでください
そうすることは非常に悪い習慣であり、上記の「バグのある」アプリケーションのほとんどが、本来あるべきことではなく、彼らがしていることをする理由です。それらを見たら所有者に文句を言ってください。また、アプリケーション開発者にも文句を言って、ゼロ遅延フレームを正しく処理するようにしてください。たとえそれがそのフレームをまったく表示せず、次のフレームを表示するための準備としてのみ使用することを意味する場合でも。結局のところ、それらは_ゼロ_時間画面に表示されます!