ImageMagick の例 --
切り取りと縁取り
- インデックス
-
ImageMagick の例 序文とインデックス
-
Crop (画像を自由な形で切り取る)
- 基本的な crop オペレーター
- 切り取りミスによる画像 (間違った crop による)
- 既存の仮想キャンバスを持つ画像を Crop する
- +repage を使用して結果から仮想キャンバスを削除する ***
- 仮想キャンバス調整によるビューポート Crop
- Gravity に相対的な Crop
- 画像のパーセンテージを Crop する
- タイル Crop、1 つの画像を複数の画像に分割する
- 中心に配置されたタイル Crop、端に余白を残す
- ストリップ Crop、行と列を切り取る
- 象限、単一の点を中心に切り取る
- 負のオフセットを使用して、下または左端を削除する
- ほぼ均等なサイズの分割に Crop する
- 間隔の空いたタイル画像の分離
-
画像の端を追加/削除する
-
行、列、端を追加/削除する
-
高度な Crop 技術
-
Trim、'自動 Crop' オペレーター
- Trim の使用
- 特定の色で Trim する
- 画像の片側だけを Trim する
- 'ファジー' 画像の Trim -- 低品質 JPEG 画像
- 'ノイズ' 画像の Trim -- スキャンまたはビデオ画像
Crop(画像をサイズダウン)
Crop とキャンバスページ
"-crop
" 画像オペレーターは、現在のシーケンス内のすべての画像の一部を、その geometry 引数で指定したサイズと位置で単純に切り取ります。
magick rose: rose.gif
magick rose: -crop 40x30+10+10 crop.gif
magick rose: -crop 40x30+40+30 crop_br.gif
magick rose: -crop 40x30-10-10 crop_tl.gif
magick rose: -crop 90x60-10-10 crop_all.gif
|
![[IM Output]](rose.gif)

![[IM Output]](crop.gif)
![[IM Output]](crop_br.gif)
![[IM Output]](crop_tl.gif)
![[IM Output]](crop_all.gif)
![[IM Output]](crop_miss.gif)
magick identify
" の出力を示します。表示された画像のサイズ (その仮想キャンバス) は、"-crop
" 操作によって影響を受けていないことに注意してください。実際の画像自体は crop され、小さくなっている可能性がありますが、GIF 画像が表示されるキャンバスは、元のキャンバスと同じサイズです。また、生成される実際の画像のサイズが、crop で要求した実際のサイズではない可能性があることにも気付くでしょう。crop 自体が crop されている実際の画像領域の外側に部分的または完全にあったため、予想よりも非常に小さい可能性があります。また、仮想キャンバス上の画像の「オフセット」は、多くの場合、crop された画像のピクセルが元の画像とまったく同じ位置になるように変更されていることにも気付くでしょう。つまり、画像自体が小さくなっても、画像の内容自体は移動しません。これは、小さい画像を修正し、画像レイヤー操作を使用して元の画像に重ね合わせると、サブ画像がもともとあった場所に正確に収まることを意味します。つまり、IM は後で使用するために、画像の「仮想キャンバス」、「ページ」、または「レイヤー」情報を保持します。これは、GIF アニメーション処理の正しい動作にとって特に重要です。詳細については、GIF アニメーションの分解を参照してください。![]() ![]() |
GIF 画像は、IM で crop された画像の「ページ」または「仮想キャンバス」のサイズとオフセット情報を積極的に使用します。この情報が必要ない場合は、"-crop " の直後に "+repage " を使用して削除します。多くの画像形式は、この仮想ページ/キャンバス情報を保存しないため、そのような形式で保存すると自動的に削除されることに注意してください。JPEG は、この情報を削除する形式の典型的な例です。 PNG 形式は、ページ/キャンバス情報をあまり使用しません (マルチ PNG (MNG) 形式を除く) が、ページオフセット情報 (負のオフセットでも) を保存します。IM は、他の IM コマンドで後で使用するために仮想キャンバスサイズを保持するためのメタデータも少し追加します。 この保持のため、その情報が必要ない場合は、予防策として、そしてそれが必要ないことを明確にするために、JPEG やその他のページレス画像形式に保存する場合でも、" +repage " を適用することを強くお勧めします。 |
注意、crop の動作はこれらの define の影響を受ける可能性があります。
trim:percent-background=X% | 端で許容される背景の量を設定します。パーセントで指定します。0% は背景が許容されないことを意味します。50% は、ファジーファクターごとに、端が最大 50% の背景であるピクセルを含むことができることを意味します。 |
trim:edges={north,east,south,west} | 画像の指定された端のみをトリムします。 |
trim:minSize=geometry | トリムを指定されたサイズに制限します。 |
type:features=string | 複雑なテキストレイアウト中に RAQM デリゲートで使用されるフォント機能を追加します。これは通常、デフォルトでは有効になっていないオプションのフォント機能を有効にするために使用されますが、デフォルトのフォント機能を無効にするためにも使用できます。機能には、カーニング、リガチャ、およびアラビア語を制御するものがあります。 |
type:hinting=false | フォントヒンティングを無効にします。適切なグリフレンダリングでは、スケーリングされたポイントを、ヒンティングと呼ばれることが多い操作を通じて、ターゲットデバイスのピクセルグリッドに沿って配置する必要があります。その主な目的の 1 つは、フォント全体で重要な幅と高さが尊重されるようにすることです。(たとえば、「I」と「T」グリフの中央の垂直線が同じピクセル幅であることが非常に望ましい場合があります。ヒンティングは、小さいピクセルサイズで問題を引き起こす可能性のあるステムやオーバーシュートなどの機能も管理します。 |
切り取りミスによる画像 (間違った crop による)
上記の例の最後の画像 (例: "crop_miss.gif
") は、特別な空の画像も生成しました。このような画像は、Crop、Trim、レイヤー比較、さらにはGIF アニメーションの最適化などの操作によって生成される可能性があり、空または非現実的な結果が生成されます。たとえば、上記の前の例では、"-crop
" 操作が crop する実際の画像を誤ったため、この特別な「ミス」画像と、いくつかの情報警告メッセージが生成されました...出力画像、または「ミス」画像は、元の画像のページまたはキャンバスサイズと、画像に関連付けられているその他のメタデータを持つ、0 オフセットの 1 ピクセルの最小画像です。ここでは、"-crop
" によって返されるはずだった「空」または「ゼロサイズ」の画像を表しますが、画像形式では「ゼロ」寸法の画像を出力できないため、代わりに単一の透明なピクセル画像が使用されます。より明確に確認できるように、「ミス」画像の "identify
" 出力と、単一の透明なピクセルのみを含むことを示すその単一ピクセル画像の「IM ピクセル列挙」を次に示します。この「ミス」画像は、基本的には "null:
" 画像を作成するのと同じですが、元のソース画像のページまたは仮想キャンバスサイズ (ただしオフセットではない) と、GIF アニメーションのタイミング遅延など、他のすべての画像メタデータが設定されています。ただし、GIF ディスポーザル方法は、crop 後もアニメーションが正しく維持されるように変更される場合があります。基本的に、"-crop
" やその他同様に関連するオペレーターが、特別な「ミス」画像を生成する可能性があることに留意する必要があります。したがって、そのような最小の画像が可能で、問題を引き起こす可能性がある場合は、IM を使用してスクリプトを作成するときに、警告メッセージまたはこの特別な「ミス画像」を探すように計画する必要があります。警告メッセージが必要ない場合 (たとえば、時折発生する「ミス」画像を予期して処理する場合) は、コマンドラインに "-quiet
" 操作制御設定を追加できます。これにより、IM は情報警告メッセージのみを出力し、実際のエラーのみを出力するように指示されます。現時点では、現在の画像シーケンスから「ミス」画像または "null:
" 画像を削除する方法はありません。ただし、このような方法は IM の将来のリリースで提案されています。このような方法が必要な場合は、メールしてください。既存の仮想キャンバスを持つ画像を Crop する
画像に既存の仮想キャンバス (たとえば、GIF アニメーションのフレーム) が既にある場合、"-crop
" 操作は仮想キャンバスを基準にして適用され、実際の画像には適用されません。つまり、キャンバス上の crop された画像の実際のピクセルデータのオフセットを保持しようとします。つまり、crop 前の特定のピクセルは、後で仮想キャンバスを基準とした同じオフセットに配置されている必要があります。このようにして、レイヤー化された画像や GIF アニメーションの crop は、「キャンバス」自体が crop されなかった場合でも、正しく動作し続けます。ここでは、ページキャンバスの中央に配置された画像を作成し、さまざまな方法で crop します。以前と同様に、キャンバスサイズ自体は操作によって変更されません。
|
![[IM Output]](paged.gif)

![[IM Output]](crop_page.gif)
![[IM Output]](crop_page_tl.gif)
![[IM Output]](crop_page_br.gif)
![[IM Output]](crop_page_all.gif)
![[IM Output]](crop_page_miss.gif)
![]() |
-quiet
" 設定で抑制したことに注意してください。何が起こっているのかをより詳しく見るために、画像の右下隅のページ分割された切り抜きを詳しく見てみましょう。ここでは、切り抜かれた領域の上に半透明の正方形を描画しました。
magick paged.gif -page 64x64+32+32 -size 32x32 xc:'#fff8' \ -alpha set -background none -mosaic crop_area_br.png |
![[IM Output]](paged.gif)

![[IM Output]](crop_area_br.png)

![[IM Output]](crop_page_br.gif)
結果から仮想キャンバスを削除する
この仮想キャンバス情報が不要な場合は、特別な "+repage
" オペレーターを使用して、ページのキャンバスと位置を実際の切り抜き画像に一致するようにリセットできます。
magick rose: -crop 40x30+10+10 +repage repage.gif magick rose: -crop 40x30+40+30 +repage repage_br.gif magick rose: -crop 40x30-10-10 +repage repage_tl.gif magick rose: -crop 90x60-10-10 +repage repage_all.gif magick rose: -quiet -crop 40x30+90+60 +repage repage_miss.gif |
![[IM Output]](rose.gif)

![[IM Output]](repage.gif)
![[IM Output]](repage_br.gif)
![[IM Output]](repage_tl.gif)
![[IM Output]](repage_all.gif)
![[IM Output]](repage_miss.gif)
-crop
" オペレーターから通常期待する結果です。実際、これは非常によくあることなので、経験則と呼ぶことができます。
'crop'のような操作の後には、必ず "
その情報を実際に保持する必要がある場合を除いて。
上記の最後の画像は、もちろん特別な切り抜きミス画像ですが、"+repage
" を使用してください。その情報を実際に保持する必要がある場合を除いて。
-quiet
" 演算設定を使用して警告メッセージを抑制しました。![]() ![]() |
IMバージョン5以前では、"+repage " 操作は、"-page +0+0 " 引数シーケンスによって処理されていました。通常は、GIFなど、仮想キャンバスとオフセット情報を使用するフォーマットに保存する直前に使用されていました。しかし、これは画像をファイルに読み書きする場合にのみ使用可能であり、複数の画像処理操作の間での使用を妨げていました。IMバージョン6、コマンドラインの再構築により、"-page " オプションは、GIFアニメーションや画像のレイヤーの作成に使用する画像読み込み/作成設定になりました。そのため、仮想キャンバス情報を設定または変更できるように、個別の "-repage " および "-set page " オペレーターが追加されました。 |
仮想キャンバス調整によるビューポート切り抜き
ImageMagickバージョン6.2.4-5以降では、"-crop
" 引数に新しい特別なフラグを追加できます。このフラグ '!
' は、返された画像の仮想キャンバス情報が切り抜かれた領域に関連するように調整するように切り抜きに指示します。言い換えれば、切り抜かれた実際の画像のサイズに関係なく、返された画像のキャンバスとオフセットは、要求した切り抜き領域に一致するように調整されます。このフラグは、切り抜き領域の「ウィンドウ」または「ビューポート」に合わせて画像を切り抜くものと考えることができます。画像の半分がその「ウィンドウ」に表示されない場合でも、返された部分の仮想キャンバスとオフセットはその「ビューポート」と一致します。たとえば...
magick rose: -crop 40x30+10+10\! crop_vp.gif
magick rose: -crop 40x30+40+30\! crop_vp_br.gif
magick rose: -crop 40x30-10-10\! crop_vp_tl.gif
magick rose: -crop 90x60-10-10\! crop_vp_all.gif
magick rose: -quiet -crop 40x30+90+60\! crop_vp_miss.gif
|
![[IM Output]](rose.gif)

![[IM Output]](crop_vp.gif)
![[IM Output]](crop_vp_br.gif)
![[IM Output]](crop_vp_tl.gif)
![[IM Output]](crop_vp_all.gif)
![[IM Output]](crop_vp_miss.gif)
![]() |
![]() ![]() |
'! ' 文字は、"csh " のような一部のUNIXシェルでは特別な意味を持ち、引用符で囲まれていても、バックスラッシュでエスケープする必要があります。 |
+repage
" を実行することと同じになります。ただし、画像の切り抜きが部分的またはミスした場合、結果はキャンバスが大きくなり、結果の画像にオフセットが生じる可能性があります。そのため、これは切り抜きの後にページ/キャンバス情報をリセットするために "+repage
" を実行する代わりにはなりません。ただし、'ビューポート切り抜き' の後に平坦化を実行して、画像の新しい仮想キャンバスを実際のピクセルで「塗りつぶす」ことができます。つまり、要求された切り抜きのサイズが保証された画像が残り、「ミスした」領域は現在の "-background
" カラーの「ビューポート」で塗りつぶされます。たとえば、画像のパディングを行う場合。
|
![]() |
![]() ![]() |
'! ' フラグは、複数の画像を生成するタイル状の切り抜きの場合、または異なる意味を持つ等しい領域のタイル状の切り抜きの場合には使用できません。以下の該当セクションを参照してください。 |
重力に対する相対的な切り抜き
"-crop
" のオフセット位置は、デフォルトでは画像の左上隅を基準にします。ただし、"-gravity
" 設定を設定することにより、"-crop
" が画像の中心、隅、または端を基準に画像を切り取るように指示できます。重力を利用した切り抜きの最も一般的な使用方法は、画像の 'center
' を切り抜くことです。
|
![]() |
-gravity
" 設定は、切り抜きの最初の 'ゼロ' 位置に影響を与えるだけでなく、切り抜きオフセットの方向にも影響を与えます。たとえば、'South
' の "-gravity
" を使用すると、'+0+5
' のオフセットは、通常のように下ではなく、切り抜き領域を上にオフセットします。
|
![]() |
+repage
" 操作を意図的に省略して、切り抜き領域が画像の下端からどのように移動したかを確認できるようにしました。また、切り抜き領域が下端(南部)を基準にしているだけでなく、領域が下端の中央になるように中央に「揃えられている」ことにも注意してください。これは、すべての重力の影響を受ける操作で実行されます。画像のパーセンテージを Crop する
"-crop
" オペレーターは、画像の元のサイズのパーセンテージのみに画像を切り抜く方法も理解しています。たとえば、これにより画像のサイズが半分になります。
|
![]() |
![]() ![]() |
サイズの数値が1つだけ指定されている場合、その値は幅と高さの両方のパーセンテージに使用され、切り抜かれる領域の最終的なサイズは最も近い整数に丸められます。オフセットはオプションではありません。 |
|
![]() |
![]() ![]() |
オフセットを指定して切り抜きを行う場合は、引数を正しく解釈できるように、引数に 'x ' 記号を必ず指定する必要があります。これは、切り抜き領域の幅と高さの両方に対して1つの数値のみが指定されている場合に特に重要です。そのため、' 50%+30+20 のような引数はエラーとなり、切り抜きが何もせずに黙って終了する結果になります。 |
|
![]() |
![]() ![]() |
パーセント記号 '% ' は引数のどこにでも表示でき、指定された場合は幅と高さの両方の数値を参照します。これは、「画像サイズ」部分が画像の仮想キャンバスまたはページサイズのパーセント分率であることを宣言するフラグです。オフセットは常にピクセル単位で指定されます。 |
|
![]() |
![]() ![]() |
タイル切り抜き(次を参照)にパーセントサイズを使用することはできません。そのため、オフセットが指定されておらず、パーセントサイズが指定されている(上記のように)場合は、+0+0のオフセットが想定されます。 |
!
' フラグは、"+repage
" が不要であることを意味します。ただし、仮想キャンバスのサイズとオフセットも持つ可能性のある入力画像には注意が必要です。タイル Crop、1 つの画像を複数の画像に分割する
切り抜きのより便利な側面の1つは、切り抜きコマンドに特定の位置を指定しない場合です。つまり、画像の切り抜く位置ではなく、サイズを指定します。この場合、切り抜きは1つの画像のみを生成するのではなく、一連の画像を生成します。
|
![[IM Output]](paged.gif)

![[IM Output]](tiles_0.gif)
![[IM Output]](tiles_1.gif)
![[IM Output]](tiles_2.gif)
![[IM Output]](tiles_3.gif)
![]() |
![]() ![]() |
"+gravity " を使用して、重力がオフになっていることを確認することをお勧めします。これは、1つの特別なケース(中心のパーセンテージ切り抜き)では、重力設定がタイル切り抜きをオフにする可能性があるためです。タイル状の切り抜きに対する重力の他の影響も未定義です。 |
-mosaic
" または "-flatten
" 画像レイヤー演算子(レイヤーの平坦化を参照)を使用すると、これらの画像をすべて重ねて、元の画像を復元できます。
|
![]() |
-mosaic
" によって背景色で塗りつぶされています。別の方法として、"-layers merge
" (レイヤーのマージを参照)を使用します。これにより、複数のレイヤー画像が、指定されたすべての画像を保持するのに十分な大きさの新しいレイヤー画像にマージされます。つまり、"-mosaic
" または "-flatten
" のレイヤー方式のように、仮想キャンバスは塗りつぶされません。
|
![]() |
|
|
+repage
" を使用してキャンバスとオフセット情報をリセットした場合、画像には切り抜かれた位置からのオフセットも、元のソース画像の元のサイズも含まれなくなります。その場合、"magick montage
" の特別な「連結
」モードを使用して、すべての画像を再度結合できます。モンタージュに、元の画像から抽出された画像の行数または列数を指示する必要があります。
magick rose: -crop 20x20 +repage +adjoin rose_tiles_%02d.gif montage -mode concatenate -tile 4x rose_tiles_*.gif rose_rejoined.gif |
![]() |
![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() |
![]() |
rose_tiles_00.gif
" から "rose_tiles_11.gif
" であり、単にメモリ上のタイルのシーケンス番号にすぎないことに注意してください。これは、ファイル名からは各タイルが属する実際の位置や、行と列ごとのタイルの総数が簡単にわからないため、あまり良い方法ではありません。IM v6.4.8-4 以降では、ファイル名パーセントエスケープを使用して、特別なラベルを生成して出力ファイル名に含めることもできます。これをFX パーセントエスケープと組み合わせて使用すると、各画像に対して異なる「タイル位置」を計算できます。たとえば...
magick rose: -crop 20x20 \ -set filename:tile "%[fx:page.x/20+1]_%[fx:page.y/20+1]" \ +repage +adjoin "rose_tile_%[filename:tile].gif" |
![]() |
![]() |
![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
rose_tile_1_1.gif
" から "rose_tile_4_3.gif
" まで生成され、はるかに優れたファイル命名規則になります。トリッキーですが、機能します。残念ながら、パーセントエスケープで生成された数値をフォーマットして、ゼロでパディングしたり、浮動小数点以下の桁数を指定したりすることはできません。少なくとも今のところは。中央揃えタイルクロップ
IMフォーラムのディスカッションで、残りの画像をエッジの周りに均等に分散させるために、タイルクロップを中央揃えにするというリクエストがありました。これを行うことで、完全なタイルを画像の中央に配置することで、完全なタイルの効果を最大化します。もちろん、不完全なエッジタイルも多くなります。解決策は、入力画像を、必要なタイルサイズの倍数である仮想キャンバスの中央に配置することでした。たとえば、"rose:
" 画像 (サイズ 70x46
ピクセル) を、画像の中央にある最大数の完全な 30x20
タイル (および残りのタイルで囲まれている) にタイルクロップするには、次のようにします。- まず、画像のサイズを分割して、画像から取得できる完全なタイルの数を計算します...
70x46 / 30x20 => 2x2 full tiles + remainder
- 次に、残りの画像 (必要な場合) を保持するために、さらに 2 つの行と列を追加します
2x2 + 2x2 => 4x4 tile images
- タイルサイズにこれを掛けて、仮想キャンバスサイズを取得します。
30x20 * 4x4 => 120x80 canvas size
- 元の画像サイズを差し引き、中央揃えオフセットのために 2 で割ります。
( 120x80 - 70x46 ) / 2 => +25+17
120x80+25+17
です。そしてここで、上記の計算を使用して、中央揃えタイルクロップを実行します...タイルの元のオフセット位置を保持したまま、中央揃えオフセットを削除する場合は、"-repage -25-17\!
" を使用して相対オフセット調整を行うことができます (上記の "+repage
" を置き換えます)。タイルの数に行と列を2つ追加しなかったためにマイナスのオフセットが生成された場合は、残りのエッジタイルを事実上無視し、画像内に存在する完全なタイルのみを出力できます。基本的に、残りのタイルは計算された仮想キャンバスの「外側」にあるため、"-crop
"演算子はそれらがそこにあったことを認識せず、無視します。再び上記の"+repage
"を、否定されたオフセット値"-repage +5+3\!
"を使用した相対オフセット調整で置き換えると、タイルがクロップされた元のオフセット位置が復元されます。中央揃えタイルクロップで残りのタイルを無視する別の方法は、仮想キャンバスの設定を適切なクロップに置き換えるだけです。
magick rose: -gravity center -crop 60x40+0+0 +gravity +repage \ -crop 30x20 +repage rose_ctiles2_%d.gif |
![]() |
![]() |
![]() |
![]() ![]() ![]() ![]() |
ストリップ Crop、行と列を切り取る
IMバージョン6.1.1では、"-crop
"が拡張され、サイズ引数の1つが欠落しているか、ゼロに設定されている場合、欠落しているサイズ引数が画像キャンバス/ページのサイズに設定されるようになりました。ほとんどの場合、関連するオフセットもゼロに設定されている場合は、キャンバス上の画像を含めるのに十分な大きさです。このわずかな変更により、画像のサイズをカバーするために '999999
'のような大きな数値を使用することなく、画像から1つの行または列を簡単に切り取ることができます。たとえば、ここでは、ページ化されたローズ画像から単純な行と列を抽出します。
|
![[IM Output]](paged.gif)

![[IM Output]](strip_column.gif)
![[IM Output]](strip_row.gif)
|
|
![[IM Output]](crop.gif)

![[IM Output]](strips_0.gif)
![[IM Output]](strips_1.gif)
![[IM Output]](strips_2.gif)
![[IM Output]](strips_3.gif)
|
-quiet
"設定を使用して抑制されました。このようなイベントを予想し、スクリプトのようにそれに備えている場合を除き、これは推奨されません。![]() ![]() |
画像が独自のページや仮想キャンバスに表示されないように配置されたり、ページキャンバスに画像の一部しか含めることができないほど大きい場合があります。 このようなまれなケースでは、サイズ引数のないストリップクロップは、画像の下位区分を誤って取得し、それぞれ、ミス画像、または仮想キャンバスの境界内の一部の小さなタイルを生成します。 ただし、" -crop "演算子は、これらのまれな特殊ケースを処理するように修正されることはありません。そうすることで、以下に示すような他のケースでの使用が妨げられるためです。これが問題になる場合は、タイル画像を生成する前に、" +repage "を使用して仮想キャンバスを削除することにより、クロップする前に画像のページオフセットをサニタイズします。 |
divide_vert
"を見てください。このプログラムを使用すると、水平方向の単色の「ギャップ」に従って画像を分割できます。たとえば、単純なテキストの画像が与えられた場合、「線」と「ギャップ」の交互の画像に分割します。簡単なオプションを使用すると、それらのギャップを削除できます。象限、単一の点を中心に切り取る
クロップサイズ番号が欠落している場合は、クロップしている画像の画像キャンバスのサイズで置き換えられます。ほとんどの場合、その次元の画像全体がクロップ結果の一部になるはずです。これにより、引数を慎重に使用することで、特定の点を中心とした画像を4分割する機能が実現されます(その特定のピクセルが左下象限画像の右上ピクセルとして配置されます)。これを行うために画像のサイズを知る必要はありません。たとえば、ここでは、ポイント 30,40 を中心に画像を 4 つの象限にクロップします。
|
![[IM Output]](paged.gif)

![[IM Output]](quadrant_tl.gif)
![[IM Output]](quadrant_tr.gif)
![[IM Output]](quadrant_bl.gif)
![[IM Output]](quadrant_br.gif)
負のオフセットを使用して、下または左端を削除する
"-crop
"で負のオフセットを使用しない理由はありません。実際、時々非常に明確な利点があります。たとえば、ページ化されたローズ画像を取得し、より大きな負のオフセットで段階的にクロップしてみましょう。"-crop
"引数に画像サイズを指定しないため、画像のキャンバスサイズがデフォルトになります。
|
![[IM Output]](paged.gif)

![[IM Output]](neg_offset_1.gif)
![[IM Output]](neg_offset_2.gif)
![[IM Output]](neg_offset_3.gif)
![[IM Output]](neg_offset_4.gif)
![[IM Output]](neg_offset_5.gif)
-chop
"演算子を使用するのに似ていますが、"-gravity
"設定はありません。エッジの削除を参照してください。もちろん、"-crop
"を使用する場合は、キャンバス/ページ情報を調整するために"+repage
"演算子を使用する必要がある場合がありますが、"-chop
"ではそのような調整が自動的に実行されます。それが人生です。ほぼ均等なサイズの分割に Crop する
タイルクロップの最大の問題は、各タイルの最終サイズのみを定義できることです。これは、画像のサイズが目的のタイルサイズの正確な倍数である場合に非常にうまく機能しますが、そうでない場合は、右端と下端に「短い」タイルが発生する可能性があることがわかりました。たとえば、組み込みのローズ画像を再度分割しますが、3x3タイルに分割してみましょう。元の画像は 70x46 ピクセルなので、3 で割ると各タイルは 23x15 ピクセルになります...ご覧のとおり、これはうまくいきませんでした。ローズ画像は3つの等しいサイズのタイルに正確に分割できないためです。この場合、1ピクセルの「短い」タイルになります。タイルのサイズを 24x16 ピクセルに拡大しても、他のタイルよりも 2 ピクセル「短い」タイルになります。この状況は、必要なタイルの数が多くなるにつれて悪化します。たとえば、長さ 100 を 30 個のタイルに分割してみてください。不可能です。長さ3を使用して34個のタイルを取得するか、4を使用して25個のタイルを取得します。正確に30個の等しいサイズのタイルを取得することは不可能です。IM v6.5.8-9 以降では、"-crop
"引数に特別な'@
'フラグを追加できるようになりました。このフラグは、指定されたタイルの数で画像を均等に分割するように最善を尽くすように、"-crop
"演算子に指示します。たとえば...結果として、画像はわずかに異なるサイズのタイルに分割されました。ただし、タイルサイズの差は最大でも1ピクセルになります。確認してください!ボーナスとして、各タイルが隣接するタイルと「重複」するように画像を細分化することもできます。これを行うには、'@
'フラグを使用するだけでなく、必要な重複ピクセル数を指定します。たとえば、ローズを4分割しますが、20ピクセルの重複を使用してみましょう。繰り返しますが、すべてのピースのサイズは最大で1ピクセルしか異なります。ただし、この場合、ローズは2で均等に分割できるため、結果として得られる画像は同じサイズになります。ただし、重複または画像のサイズが奇数の場合はそうではありません。その場合、大きい要素は上端と左端に配置されます。ただし、3つのタイルの場合、より大きい(または小さい)要素が中央に配置されます!タイル間で正確にそのピクセル数を「スキップ」するために、負の重複を使用することもできます!演算子をどのように適用する必要があるかは、正確にどのピクセルを「重複」または「スキップ」したいかによって異なります。そして、それは画像の「エッジ」の特性に依存します(以下の間隔を空けたタイル画像の分離を参照)。"-crop
"演算子の使用と同様に、不要な場合は'ページ'オフセットを削除するために"+repage
を使用することをお勧めします。ただし、クロップされた画像のオフセット情報は非常に役立つ可能性があるため、保持されます。たとえば、それを使用して出力ファイルに名前を付けたり、IMが計算したタイルのサイズと位置を調べたりできます。等しいサイズのタイルクロップは、"-crop
"演算子が、画像のどの部分をクロップするかを計算する際に、画像の実際の仮想キャンバスを無視する唯一の状況であることに注意してください。つまり、タイルクロップの計算は、仮想キャンバスサイズではなく、実際の画像サイズに基づいています。それにもかかわらず、最終的なタイルオフセットは、元の仮想キャンバスに対する相対的なものになります。このクロップオプションは、'ページ化された'画像に対してシェーブ演算子の代わりに使用することもできます。![]() ![]() |
IM バージョン v6.6.1-0 より前では、仮想キャンバスオフセットを持つ画像の等しいサイズのタイルクロップが壊れていました。 |
間隔の空いたタイル画像の分離
多くの場合、画像は固定サイズのタイルで構成され、それらのタイルは一定の間隔で区切られています。新しい '@
' フラグのクロップ演算子を使用すると、周囲のスペースを含めたりスキップしたりして、これらのタイルをより簡単に切り出すことができます。しかし、主な問題は、タイル画像の間には一定のスペースがあるものの、エッジ周辺のスペースは通常、それほど一定ではないことです。これにより、「間隔を空けた」画像のセットには、3つの基本的なエッジ特性スタイルが生じ、それぞれのタイプをわずかに異なる方法で処理する必要があります。
モンタージュされたタイルここでは、元の画像に固定サイズの境界線を追加してから、結合しただけです。その結果、タイル間のピクセル間隔は常に偶数になります。さらに重要なことに、「エッジ間隔」は、タイル間に配置された間隔のちょうど半分です。実際、これは "montage
" がタイリング「セル」の間隔を空ける方法であり、以下の例の画像が生成されたのはこのコマンドを使用したためです。画像は単にタイル状に配置されただけなので、通常の タイルクロップ(タイルのサイズがわかっている場合)を使用するか、等間隔クロップ(タイルの数がわかっている場合)を使用して、サブイメージと周囲の境界線を分離することができます。基本的にタイル間に重なりはなく、単純な シェーブ演算子を使用して、結果のタイルからその境界線を削除できます。
magick montage.gif -crop 5x1@ +repage +adjoin montage_%d.gif magick montage_?.gif -shave 3x3 montage-3_%d.gif |
![]() |
![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
![]() ![]() ![]() ![]() ![]() |
@
'と'!
'の両方のフラグを含めることによって、この特殊な状況をIMに伝える必要があります。このサブ分割のエッジにある画像は、中央にある画像よりもわずかに短いことに注意してください。これが、この特別な「モード」の動作が、前の間隔を空けたタイルのカテゴリよりも実際には単純であるにもかかわらず、デフォルトではない理由です。また、'@
'と'!
'の両方のフラグを使用する場合、単一タイルのクロップ(この場合は垂直方向)は効果がありません。タイルの上部と下部の両方が「エッジ」であり、削除する「エッジスペース」がないためです。ここでも、オーバーラップに負の値を使用することで、タイルクロップの結果にオーバーラップ(間隔)領域を含めないようにIMに指示できます。
![]() ![]() |
'! ' 文字は、"csh " のような一部のUNIXシェルでは特別な意味を持ち、引用符で囲まれていても、バックスラッシュでエスケープする必要があります。 |
画像エッジの追加/削除
境界線、画像の周囲にスペースを追加する
多くの場合、画像の周囲に少し作業スペースを追加したいだけで、そのためには画像のサイズを知ったり、それに依存したりする必要はありません。現在、空白の画像またはラベルを追加する、'Src
'オーバーレイを構成する、または画像をより大きなキャンバスに配置するなど、直接的なスペースの追加以外にも、画像に余分なスペースを追加する方法はたくさんあります。しかし、これらのメソッドでは通常、作業対象の画像のサイズを少なくともある程度知る必要があります。最も単純な形式の画像スペースの追加の1つは、 "-border
" 操作です。追加されたスペースの色は "-bordercolor
" 設定です。以下に、いくつかの簡単な例を示します。
magick rose: -bordercolor SkyBlue -border 10x10 border.gif magick rose: -border 15x6 border_default.gif magick rose: -bordercolor LimeGreen -border 10x0 border_sides.gif magick rose: -bordercolor Tomato -border 0x10 border_topbot.gif magick rose: -alpha set -bordercolor none -border 10 border_none.gif |
![[IM Output]](border.gif)
![[IM Output]](border_default.gif)
![[IM Output]](border_sides.gif)
![[IM Output]](border_topbot.gif)
![[IM Output]](border_none.gif)
none
」に設定しましたが、これが期待どおりに機能するためには、画像に実際に「マット」または「アルファ」チャンネルが含まれていることを確認する必要がありました。また、垂直方向と水平方向の境界線のサイズが同じ場合は、境界線の2番目の数字を省略し、1つの数字のみを使用できることに注意してください。![]() ![]() |
上記のように、 "-border " 演算子によって使用されるデフォルトの色は、WWW上のWebページのデフォルトのグレーページの色とよく一致する薄いグレーです。 |
|
![]() |
-border
" は、正しいサイズの新しい画像を作成し、その新しい背景の上に元のソース画像をオーバーレイしています。これは、ImageMagick自体の中でも、透明および半透明の画像の背景を設定するために非常に役立つ操作です。つまり、一見役に立たない "-border 0
" 操作は、IMバージョン6では非常に役立つ操作です。例を挙げると...もちろん、アルファ透明度を削除する方法は他にもたくさんあります。![]() ![]() |
透明度を持つ画像に境界線を追加すると、デフォルトで画像の透明な背景も塗りつぶされるという事実は、IMユーザーと開発チームの間で議論の的となっていました。この議論の概要については、境界線、フレーム、および BorderColor の使用で説明しています。 |
境界線とアルファ合成
境界色キャンバスへの画像のオーバーレイは、 "-compose
" 設定によって制御されます。この設定はデフォルトで 'Over
' アルファ合成に設定されています。他の設定に変更されている場合、 "-border
" 操作は予期しない結果を生み出す可能性があります。たとえば、透明領域を含む画像に適用した場合の "-compose
" と "-border
" 画像演算子の興味深い使用例を次に示します。'Over
' と 'Copy
' のどちらを使用するかは、基本的に、画像の透明度を保持するかどうかを決定します。たとえば、透明度を持つ同じ「星」の画像ですが、今回は画像の透明度を損なうことなく境界線が追加されています。
|
![]() |
Src
' 合成は、現在の "-bordercolor
" 設定に関係なく、画像に透明な境界線を追加します(アルファチャンネルがある場合)。基本的に、生成された背景キャンバス "-border
" は無視されます。 'Dst
' はあまり役に立たないように見えるかもしれませんが、元の画像と同じサイズ(または少し大きい)のキャンバスを生成するために使用できます。元の画像は、キャンバスの最終サイズを決定するためだけに使用されます。詳細については、既存の画像に合わせてサイズ調整されたキャンバスを参照してください。さまざまな "-compose
" メソッドの詳細については、アルファ合成の例を参照してください。境界線と仮想キャンバス
仮想キャンバスを含む画像に "-border
" を適用すると、仮想キャンバス上の実際の画像の周囲に境界線が追加されます。キャンバス全体には追加されません。仮想キャンバスのサイズも、追加された境界線に合わせて境界線の厚さの2倍に拡大されたことに注意してください。これはもちろん、アニメーションの個々のサブフレームを実際に識別しない限り(たとえば、オーバーレイ画像を「フレーム」として使用するスクリプトアニメーションフレームモンタージュを参照)、通常のGIFアニメーションに直接境界線を追加できないことを意味します。境界線を追加する場合は、最初にアニメーションを合体して、フレーム最適化を削除する必要があります。フレーム、3Dのような境界線を追加する
"-frame
" 演算子は "-border
" と非常によく似ており、以下に生成された最初の例の画像を見ると、 "-bordercolor
" ではなく "-mattecolor
" を使用した点を除いて、まったく同じ結果が生成されることがわかります。"-bordercolor
" は、フレーム画像生成でも使用されることに注意してください(下記参照)。"-frame
" を適切に使用するには、コマンドに2つではなく4つの引数を指定する必要があります。追加の引数は、生成されるフレームの「外側」と「内側」のベベルの幅を指定します。以下に、さまざまな設定で "-frame
" 演算子を使用する例をいくつか示します。
magick rose: -frame 10x10 frame.gif magick rose: -frame 15x6+2+2 frame_wierd.gif magick rose: -mattecolor SkyBlue -frame 6x6+2+2 frame_blue.gif magick rose: -mattecolor Tomato -frame 10x10+5+5 frame_red.gif magick rose: -frame 10x10+10+0 frame_rasied.gif magick rose: -frame 10x10+6+0 frame_rasied_part.gif magick rose: -frame 10x10+0+6 frame_sunken_part.gif magick rose: -frame 10x10+0+10 frame_sunken.gif |
![[IM Output]](frame.gif)
![[IM Output]](frame_wierd.gif)
![[IM Output]](frame_blue.gif)
![[IM Output]](frame_red.gif)
![[IM Output]](frame_rasied.gif)
![[IM Output]](frame_rasied_part.gif)
![[IM Output]](frame_sunken_part.gif)
![[IM Output]](frame_sunken.gif)
magick rose: -frame 10x10+3+3 frame_normal.gif magick rose: -frame 3x3+3+0 -frame 7x7+3+0 frame_popped.gif magick rose: -frame 7x7+0+3 -frame 3x3+0+3 frame_pressed.gif magick rose: -frame 3x3+3+0 -frame 4x4 -frame 3x3+0+3 frame_inverted.gif |
![[IM Output]](frame_normal.gif)
![[IM Output]](frame_popped.gif)
![[IM Output]](frame_pressed.gif)
![[IM Output]](frame_inverted.gif)
![]() ![]() |
デフォルトの "-mattecolor " は、デフォルトの "-bordercolor " 設定よりもわずかに暗いグレーです。これにより、WWW上のWebページのデフォルトのグレー色(「mosaic 」や「netscape 」などの初期のブラウザーで使用)と一致させることもできます。(下記参照) |
![]() ![]() |
"-frame " は実際には "-mattecolor " カラーを使用する可能性がありますが、フレームの描画に使用するために、このベースからさらに4つの追加の色を生成します。つまり、画像には1つだけでなく、5つの関連色が追加される可能性が高くなります。 |
magick montage
" のようなフレーム付き画像を再現することもできます。
|
![]() |
-frame
」には、半透明の「-mattecolor
」を使用することもでき、さらに(フラクタルプラズマキャンバスなどの)面白いパターンを「下敷き」にして、よりカラフルなフレームを作成できます。
|
![]() |
フレームとアルファ合成
フレームは「-border
」演算子と密接な関係があります。フレームは「-mattecolor
」を使用して描画されるだけでなく、この演算子はフレームが最初に描画される背景を定義するために「-bordercolor
」設定も利用します。透明度がない画像の場合、「-bordercolor
」は画像自体によって重ねられるため、表示されません。しかし、透明な領域を含む画像の場合、背景色が可視になります。
|
![]() |
-frame
」は、画像を単色の背景を持つ額縁に重ねるように機能します。そのため、画像の透明な部分は、「-bordercolor
」(デフォルトでは薄い灰色)に置き換えられます。![]() ![]() |
透明度のある画像にフレームを追加すると、デフォルトで画像の透明な背景がボーダーカラーで塗りつぶされるという事実が、IMユーザーと開発チームの間で議論を引き起こしました。この議論の概要は、ボーダー、フレーム、およびBorderColorの使用に記載されています。 |
none
」などの透明な「-bordercolor
」を使用することです。
|
![]() |
Copy
」という特別な「-compose
」メソッドを使用することで実現できます。
|
![]() |
![]() ![]() |
「-bordercolor 」を「-border 」と「-frame 」の両方の背景画像として使用する方法は、IMバージョン6.1.4で追加されました。それ以前は、生成された背景キャンバスは、ボーダーまたはフレームが描画される黒いキャンバスで構成されていました。この黒色の使用は、「 magick montage 」コマンドで特に問題がありました。このコマンドは、内部処理で内部の「-frame 」関数を多用するためです(モンタージュの背景と透明度の処理を参照)。 |
-frame
」演算子は、「-border
」と同様に、「-compose
」設定を使用して、ソース画像が背景フレームにどのように重ねられるかを定義します。「Copy
」の「-compose
」設定の使用は、「magick montage
」フレームで「-bordercolor
」設定も使用したい場合に非常に重要になります。詳細については、モンタージュの背景と透明度の処理を参照してください。フレームと仮想キャンバス
ボーダーと仮想キャンバスと同様に、フレームも仮想キャンバス上の実際の画像の周囲に適用され、キャンバス全体には適用されません。
|
![[IM Output]](paged.gif)

![[IM Output]](paged_framed.gif)
シェーブ、画像からエッジを削除する
「-border
」または「-frame
」演算子の逆は、「-shave
」であり、同じ引数が指定された場合、これらのコマンドによって追加されたスペースを削除します。
magick border.gif -shave 10x10 shave.gif magick border.gif -shave 10x0 shave_sides.gif magick border.gif -shave 0x20 shave_topbot.gif |
![[IM Output]](border.gif)

![[IM Output]](shave.gif)
![[IM Output]](shave_sides.gif)
![[IM Output]](shave_topbot.gif)
-chop
」演算子を使用する必要があります(下記のチョップの例を参照)。以前と同様に、「-border
」、「-frame
」、および「-shave
」のすべての演算子は、仮想キャンバス上の実際の画像のみに影響し、仮想キャンバス自体には影響しません。
|
![[IM Output]](paged.gif)

![[IM Output]](paged_border.gif)

![[IM Output]](paged_frame.gif)

![[IM Output]](paged_shave.gif)
-shave
」とは異なり、結果として得られる画像のキャンバスサイズを変更しないことです。
![]() ![]() |
IMバージョンv6.6.1-0より前では、キャンバスオフセット(上記など)を持つ画像の等しいサイズのタイルクロップは壊れていました。 |
エクステント、直接的な画像サイズ調整
いくつかの議論の後、画像サイズの最終的なサイズを直接調整する演算子がIMバージョン6.2.4に追加されました。「-extent
」演算子です。画像サイズが増加すると、画像の右端または下端にスペースが追加されます。減少した場合は、新しい画像サイズに合わせて画像データが破棄または切り取られます。どちらの場合も、画像の左上の領域は影響を受けない可能性があります。
magick rose: -background skyblue -extent 100x60 extent_enlarge.gif magick rose: -background skyblue -extent 40x40 extent_shrink.gif magick rose: -background skyblue -extent 100x40 extent_wider.gif magick rose: -background skyblue -extent 40x60 extent_taller.gif |
![[IM Output]](extent_enlarge.gif)
![[IM Output]](extent_shrink.gif)
![[IM Output]](extent_wider.gif)
![[IM Output]](extent_taller.gif)
-background
」色で塗りつぶされます。![]() ![]() |
IMバージョンv6.3.2より前は、「-extent 」は新しい領域のメモリをゼロまたは真っ黒にクリアしただけでした。領域を「-background 」色で塗りつぶしませんでした。 |
-extent
」は「-gravity
」を使用して、追加/削除された領域が元の画像に対して配置される場所を定義します。
magick rose: -gravity north -extent 100x80 extent_north.gif magick rose: -gravity south -extent 100x80 extent_south.gif magick rose: -gravity east -extent 100x80 extent_east.gif magick rose: -gravity west -extent 100x80 extent_west.gif magick rose: -gravity center -extent 100x80 extent_center.gif magick rose: -gravity center -extent 40x80 extent_center2.gif |
![[IM Output]](extent_north.gif)
![[IM Output]](extent_south.gif)
![[IM Output]](extent_east.gif)
![[IM Output]](extent_west.gif)
![[IM Output]](extent_center.gif)
![[IM Output]](extent_center2.gif)
-repage
」を必要とせずに中央揃えのクロップも実行できることを示していますが、現在の「-background
」色で画像を「フラット化」します。オフセットを使用することもできます。これは基本的に、エクステント演算子が、位置に関係なく、背景パディングでクロップを簡単に行うことを意味します。
|
![]() |
-extent
」は、ボーダーとフレームの両方の演算子が使用するのと同じ「オーバーレイ」手法を使用して機能することに注意してください。そのため、デフォルトで透明度を含む画像で使用すると、透明度が現在の「-background
」色に置き換えられます。
|
![]() |
-compose
」メソッドを適切に設定するか、「-background
」色を「None
」に設定することです。行、列、エッジの追加/削除
スプライス、行、列、エッジの追加
「-splice
」演算子はIMバージョン6で新しくなりました。スプライス、新しい画像演算子の作成例を参照してください。基本的に、画像の中央または一方のエッジにスペースの行、列を追加する、非常に必要とされている機能を提供します。挿入されたスペースの色は、「-background
」色の設定から取得されます。
magick rose: -background blue -splice 20x10+40+30 splice.gif magick rose: -background blue -splice 20x0+40+0 splice_column.gif magick rose: -background blue -splice 0x10+0+30 splice_row.gif magick rose: -background blue -splice 20x10 splice_topleft.gif |
![[IM Output]](rose.gif)

![[IM Output]](splice.gif)
![[IM Output]](splice_column.gif)
![[IM Output]](splice_row.gif)
![[IM Output]](splice_topleft.gif)
![]() ![]() |
背景色が設定されていない場合、IMは画像自体からこの値を判断しようとします。これは、一部の画像では白(通常のデフォルト)になる可能性があり、他の画像では黒、GIF形式では、画像が保存されたときに設定された背景色が何であれ、そうなる可能性があることを意味します。
基本的にこれが意味することは、「 -background 」を設定してください。
|
-splice
」演算子は、画像の1つのエッジだけにスペースを追加するのに最適です。どのエッジかは、「-gravity
」オプションとスプライスジオメトリ設定を使用して決定されます。
magick rose: -background blue -splice 0x10 splice_top.gif magick rose: -gravity south \ -background blue -splice 0x10 splice_bottom.gif magick rose: -background blue -splice 20x0 splice_left.gif magick rose: -gravity east \ -background blue -splice 20x0 splice_right.gif magick rose: -gravity southeast \ -background blue -splice 20x10 splice_botright.gif |
![[IM Output]](splice_top.gif)
![[IM Output]](splice_bottom.gif)
![[IM Output]](splice_left.gif)
![[IM Output]](splice_right.gif)
![[IM Output]](splice_botright.gif)
|
![]() |
チョップ、行、列、エッジの削除
「-splice
」の自然な逆は、はるかに古い「-chop
」演算子です。「-splice
」と同じ引数と、同じ「-gravity
」設定が与えられた場合、「-chop
」は画像を元の形状に戻します。
magick splice.gif -chop 20x10+40+30 splice_chop.gif magick splice_chop.gif -chop 20x10+30+20 chop.gif magick chop.gif -background grey \ -splice 20x10+30+20 chop_splice.gif |
![[IM Output]](splice.gif)

![[IM Output]](splice_chop.gif)

![[IM Output]](chop.gif)

![[IM Output]](chop_splice.gif)
-splice
」と「-chop
」の順序を逆にする方法を示すために、最後の例の処理を続けました。チョップは、重力を使用してそのエッジを選択し、画像から単一のエッジを切り取るためにより一般的に使用されます。たとえば...
magick frame_red.gif -chop 0x10 chop_top.gif magick frame_red.gif -chop 10x0 chop_left.gif magick frame_red.gif -gravity East -chop 10x0 chop_right.gif magick frame_red.gif -gravity South -chop 0x10 chop_bottom.gif |
![[IM Output]](frame_red.gif)

![[IM Output]](chop_top.gif)
![[IM Output]](chop_left.gif)
![[IM Output]](chop_right.gif)
![[IM Output]](chop_bottom.gif)
-chop
" を使用する代わりに、より汎用的な "-crop
" オペレーターを使用することができます。これを使用する場合、下端または右端を取得するために "-gravity
" を使用する必要はありませんが、その後で画像のキャンバスを "+repage
" する必要があります。
magick frame_red.gif -crop +0+10 +repage crop_edge_top.gif magick frame_red.gif -crop +10+0 +repage crop_edge_left.gif magick frame_red.gif -crop -10+0 +repage crop_edge_right.gif magick frame_red.gif -crop +0-10 +repage crop_edge_bottom.gif |
![[IM Output]](frame_red.gif)

![[IM Output]](crop_edge_top.gif)
![[IM Output]](crop_edge_left.gif)
![[IM Output]](crop_edge_right.gif)
![[IM Output]](crop_edge_bottom.gif)
-crop
" に削除する画像領域が指定されていない場合、画像キャンバスのサイズ(実際の画像ではなく、画像の仮想キャンバス)がデフォルトになるという事実に依存しています。つまり、(単純な画像の場合)切り取るクロップ領域をオフセットするだけで、画像の端を削除できます。"-crop
" を使用して画像の端を「chop」する方法は、Don Sheythe によって発見および公開され、議論の結果、IM の「機能」と見なされ、ここに含められました。高度なクロッピングテクニック
指定されたアスペクト比で Crop する
特定の縦横比に合わせて画像をクロップできますが、これはトリッキーで、DIY の数学的テクニックをいくつか使用します。たとえば、計算を実行してから クロップを実行するスクリプトを作成できます。または、IM v6 では、ディストート ビューポートを使用して計算を行い、No-Op ディストーション中に画像の目的の部分を抽出できます。中央揃えの正方形クロップで説明されているように。ただし、ImageMagick バージョン 7 では、"-crop
" や "-extent
" などのコマンドで直接数学的計算を実行できるようになったため、"-distort
" を誤用する必要がなくなりました。これについては、IM 開発者フォーラムの 縦横比に合わせてクロップで詳しく説明されています。トリム、'自動クロップ'オペレーター
"-trim
" オペレーターは、上記で説明した非常に汎用性の高い "-crop
" オペレーターと非常に密接な関係があります。ただし、このオペレーターは引数を提供する代わりに、色や透明度が変化しない画像の境界線または端を削除しようとします。言い換えれば、画像の周囲にある「退屈な」部分を削除します。![]() ![]() |
ImageMagick バージョン 5 以前では、自動クロップ操作は、"-crop " オペレーターに「0x0 」引数を使用することで実現されていました。現在、これは当てはまりません。クロップの「ゼロ」サイズの引数は、現在、「無限」または「画像サイズの限界まで」を意味します。
したがって、クロップに対する「 |
たとえば、ここでは IM ロゴを取り上げ、サイズを変更し、ロゴの周囲の余分なスペースをすべて「トリム」または「自動クロップ」します。
-crop " と同様に、"-trim " は画像のキャンバスサイズを保持します。つまり、トリムの数値引数を抽出して、画像処理のさらなる処理または調整を可能にすることができます(この例については「ノイズの多い」画像をトリミングを参照してください)。 |
![]() |
ただし、この情報に関心がなく、単に "+repage " オペレーターを使用するか、キャンバス情報を保存しない形式(JPEG 形式など)で保存することによって、画像のページ情報をリセットして破棄するだけです。ここでは、キャンバス情報を破棄していることを明確にするために、両方を行います。
|
![]() |
-trim
" オペレーターはわずかな色の変化を認識するため、予想どおりに画像の近くまでトリムされませんでした。画像がすべて1色の場合、"-trim
" は画像を最小限の単一ピクセルの透明な 見逃した画像にトリムします。これは論理的であり、画像をそのままにした場合に発生する可能性のあるより深刻な問題を回避します。特定の色で Trim する
"-trim
" の最も懸念される問題の1つは、特に自動画像処理スクリプトでは、トリムが少し予測不可能になる可能性があることです。たとえば、特定の1色、または1色だけに限定するわけではありません。そのため、予想よりもはるかに多くトリムされる可能性があります。たとえば、ストライプカラーの単純な画像の単純なトリムを実行してみましょう。
magick -size 32x32 xc:red xc:green xc:blue +append stripes.gif magick stripes.gif -trim +repage stripes_trimmed.gif |
-trim
" は1色だけでなく2色もトリムしました!自動スクリプトでは、これは非常に悪い場合があり、予期しない結果が生じる可能性があります。画像からトリムする色を知っている場合は、画像のその色の小さな1ピクセル幅の "-border
" を追加する方が良い方法です。この場合は「red
」を使用します。
magick stripes.gif -bordercolor red -border 1x1 \ -trim +repage stripes_trim_red.gif |
-border
" を使用すると、"-trim
" が苦労して維持したキャンバスオフセットも変更されます。そのため、仮想キャンバス情報を削除せずに結果を見ると、画像が移動していることがわかります。
![]() ![]() ![]() |
![]() ![]() ![]() |
|
|
![]() |
border_widthx2
を減算)とオフセット(border_width
を減算)を修正してみましょう。
|
![]() |
-trim
" 操作自体は、画像の場所を正しく保持しました。ご覧のとおり、かなり扱いにくい調整です。あるいは、キャンバスサイズに関心がない場合(レイヤー化された画像では一般的)、はるかに単純な相対リページを使用して、拡大されたキャンバス上の画像の位置のみを調整できます。
|
![]() |
画像の片側のみをトリミング
上記で見たように、"-trim
" は可能な限り多くの側面をトリムします。異なる側面から2つの異なる色を削除するほどです(または、非常に注意して配置すれば、4色を削除できた可能性があります)。このため、トリミングを片側だけに制限したい場合は、少し難しくなります。片側だけをトリムすることを保証するには、他の3つの側面を保護するために、他の側にいくつかのカラーストライプを追加する必要があります。以前に作成した「境界線」画像の「左」または「西」側のみをトリミングするためのステップバイステップのプロセスを次に示します。この例では、より見やすくするために、必要以上に太いストライプを使用しました。通常は1ピクセル幅のみが必要です。
magick border.gif -gravity East \ -background white -splice 5x0 \ -background black -splice 5x0 trim_protect.gif magick trim_protect.gif -trim +repage trim_oneside.gif magick trim_oneside.gif -gravity East -chop 5x0 trim_west.gif |
![]() ![]() ![]() ![]() ![]() ![]() ![]() |
||
|
![]() |
-gravity
" 設定は必要なく、設定は画像の「North-West
」設定にデフォルト設定されます。
|
![]() |
ファジーカラー選択を使用したトリミング-- 低品質の JPEG 画像
JPEG は「可逆」であるため、画像の色は通常、単一の色ではなく、わずかに異なる色のバンドです。このため、"-trim
" は多くの場合、JPEG または現実世界の画像で失敗します。今後:ここで失敗例を示しますそのため、ImageMagick に、完全に同じではないが、かなり近い色を同じものとして扱う必要があることを伝える必要があります。非常に小さな "-fuzz
" 設定を追加すると、これが行われます。
magick image.jpg -fuzz 1% -trim +repage image_fuzzy_trim.jpg |
-border
" オペレーターを使用して、その色の境界線を追加することで、具体的に追加できます。境界線は常にトリミングする色と一致するため、常に "-trim
" によって削除されます。今後:ここでファジー境界線トリムの例を示します 「ノイズの多い」画像のトリミング-- スキャンした画像
スキャン画像でも同様の問題に直面します。スキャナーは、ほこり、汚れ、スキャナーのわずかな変動、またはリーダーが拾う単なる電子ノイズによって、小さな単一ピクセルのエラーを生成することがよくあります。しかし、この場合のピクセルエラーは、小さなファジーファクターでは対応できないほど大きいことが多いため、このような画像をトリミングするには別の手法が必要です。最も簡単な解決策は、多くの場合実用的ではありませんが、同じ画像の複数のスキャン、または動画の静止シーケンスの複数のフレームを取得し、その結果を平均化して干渉を減らすことです。しかし、これではスキャナー上のほこりの斑点を削除したり、単一の画像またはフレームしか利用できない場合に役立つことはなく、ほとんどの場合、この方法は実用的ではありません。実用的な解決策は、2段階のものです。画像のコピーを作成し、単一ピクセルのエラーやスキャナーのほこりを強調しないように処理し、同時にコントラストの高い大きなブロックの効果を強調します。次に、このコピーに対して「-trim
」を使用し、それが正確に何を行ったかを調べれば、元の変更されていない画像を同じ量だけ「-crop
」できます。単一ピクセルのエラーを強調しないための方法は多数あります。これには、「-blur
」、「-median
」、または基本的なモルフォロジー演算子を使用して、テキストや細い線などの特定の詳細を削除することさえ含まれます。この「blur」メソッドでは、2つの主要なコントロールが提供されます。たとえば、より小さな「logo: 」画像を使用してみましょう。
|
![]() |
![]() ![]() |
ぼかしによる適切な「エッジ効果」を得るためには、仮想ピクセルの設定を確認する必要があるかもしれません。 または、ぼかしを適用する前に、画像の背景色と同じ色の幅広の境界線を追加し、オフセットの結果を適切に調整することもできます。これは、「 -blur 」および「-trim 」演算子によるより正確な結果を得るのに適している場合があります。 |
-trim
」は内部的に「-crop
」の引数として「89x121+78+23
」を使用していたと判断できます。これは、トリミングされた画像の実際のサイズと、仮想キャンバス上のオフセットであり、おそらく画像内にある、探している主要な(単一の)オブジェクトの位置です。これは、ぼかしを適用していない元の画像で使用できます。
|
![]() |
これは、「UNIXシェルスクリプト」を少し追加し、最初のコマンドの結果を整形することで、1行で実行できます。
info: 」の出力を制御するために使用される「-format 」設定の詳細については、画像プロパティエスケープを参照してください。 |
![]() |
![]() ![]() |
上記では、バッククォート「`...` 」を使用した「コマンド置換」メソッドのUNIXコマンドラインシェル機能を使用して、生成された「-crop 」引数を外側の「magick 」コマンドに挿入します。これは、特別な FOR..DO 構文を使用して、Windowsバッチスクリプトで実行できます。詳細については、上記のリンクをたどってください。 |
この方法は、FXエスケープを使用して数学を行うことで、トリミングされた領域を少量(4方向に10ピクセル)拡大することで改善できます。
|
![]() |