次のような小さな画像を含む画像があります:
------
| 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