ImageMagick - タイル画像からアニメーション GIF を作成するが、「仮想キャンバス」メタデータに問題がある

ImageMagick - タイル画像からアニメーション GIF を作成するが、「仮想キャンバス」メタデータに問題がある

次のような小さな画像を含む画像があります:

------
| 1  |
------
| 2  |
------
| 3  |
------
| 4  |
------

各サブ画像は100x200、画像全体は100x800です。

これらすべてを 1 つのアニメーションに結合し、画像 1 から 4 までをループ再生したいと思います。

私はimagemagickのconvertツールを使って画像をトリミングします。例えば、バッチファイルを作りました

convert %1 -crop 100x200+0+0 %~n1_01.png
convert %1 -crop 100x200+0+200 %~n1_02.png
convert %1 -crop 100x200+0+400 %~n1_03.png
convert %1 -crop 100x200+0+600 %~n1_04.png

そして、それをイメージで実行しますmain.jpg

これは画像のセットを作成しますが、次のようにgif​​に変換しようとすると

convert *.png out.gif

100x200 サイズの単一のアニメーションの代わりに、100x800 サイズのアニメーションが生成され、画像が特定のオフセットでポップアップ表示されます。

identify切り取った画像をいくつか見ると、

main_01.png PNG 100x200 100x800+0+0 8-bit sRGB 4.74KB 0.000u 0:00.000
main_02.png PNG 100x200 100x800+0+200 8-bit sRGB 3.39KB 0.000u 0:00.000

おそらく、imagemagick はメタデータを読み取って、私が実際に 100x800 のキャンバスを使用し、各画像を特定のオフセットに配置する必要があることを判断することで、役に立とうとしているのでしょう。これは私が望んでいることではありません。

確かに、チュートリアルimagemagick はあなたを助けるためにそれをそこに残しています。

つまり、IM は、後で使用するために画像の「仮想キャンバス」、「ページ」、または「レイヤー」情報を保持します。これは、GIF アニメーション処理を正しく動作させるために特に重要です。

ペイントで各ファイルを手動で開いて再保存し、再識別するとmain_02.png

main_02.png PNG 100x200 100x200+0+0 8-bit sRGB 4.03KB 0.000u 0:00.000

すべての画像に対してこれを実行し、再度 gif に変換すると、最終的に希望どおりの 100 x 200 の gif になります。

ペイントで手動で行う必要がないように、すべてのオフセットを (0, 0) に設定するにはどうすればよいですか?

答え1

+repage切り抜き後に以下の操作を行うことで、仮想キャンバスの座標をリセットできます。

convert %1 -crop 100x200+0+0 +repage %~n1_01.png
convert %1 -crop 100x200+0+200 +repage %~n1_02.png
convert %1 -crop 100x200+0+400 +repage %~n1_03.png
convert %1 -crop 100x200+0+600 +repage %~n1_04.png

また、画像をタイルに分割するためのバッチ ファイルは必要ありません。サイズのみを指定すると、タイルに分割されます。出力ファイル名でタイル番号として「%d」を使用します。

convert %1 -crop 100x200 +repage %~n1_%d.png

または、2桁の固定幅の数字の場合:

convert %1 -crop 100x200 +repage %~n1_%02d.png

4 つの画像が生成されます。

実際、一時的な中間画像ファイルをまったく生成せずに、同じコマンドで GIF 変換を行うこともできます。次のコマンドは、必要なことをすべて一挙に実行します。

convert %1 -crop 100x200 +repage out.gif

詳細については、のドキュメント-cropそしてまた+repage(-repage任意の画像内の仮想キャンバス データを単独で編集するためにも使用できます)。


ちなみに、画像を分割する別の方法は、番号タイルのサイズではなくタイルの数を指定します。これは、サイズを指定することで実現できます。タイルで切り取って「@」記号を追加すると、上記と同じ結果になります。

convert %1 -crop 1x4@ +repage %~n1_%02d.png

関連情報