ImageMagick の例 --
切り取りと縁取り

インデックス
ImageMagick の例 序文とインデックス
Crop (画像を自由な形で切り取る)
画像の端を追加/削除する
行、列、端を追加/削除する
高度な Crop 技術
Trim、'自動 Crop' オペレーター
ここでは、ImageMagick の操作について説明します。これにより、画像を切り刻んだり、画像の周囲にフレームや縁取りを追加したりできます。つまり、画像の内容を拡大縮小せずに、画像のサイズを変更する操作について見ていきます。これは単純な操作だと思うかもしれませんが、実際そうです。非常に単純なので、IM はこのタスクを実行するための膨大な数の方法と手段を提供しています。非常に多いため、それらすべてを示すために、専用の例のページを作成する必要がありました。

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
  magick rose: -crop 40x30+90+60  crop_miss.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
ここで何が起こったのかを正確に確認できるように、上記の crop の結果に対する "magick identify" の出力を示します。

  magick identify rose: crop.gif crop_br.gif crop_tl.gif \
                 crop_all.gif crop_miss.gif
[IM Text]
表示された画像のサイズ (その仮想キャンバス) は、"-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") は、特別な空の画像も生成しました。このような画像は、CropTrimレイヤー比較、さらにはGIF アニメーションの最適化などの操作によって生成される可能性があり、空または非現実的な結果が生成されます。たとえば、上記の前の例では、"-crop" 操作が crop する実際の画像を誤ったため、この特別な「ミス」画像と、いくつかの情報警告メッセージが生成されました...
[IM Text]
出力画像、または「ミス」画像は、元の画像のページまたはキャンバスサイズと、画像に関連付けられているその他のメタデータを持つ、0 オフセットの 1 ピクセルの最小画像です。ここでは、"-crop" によって返されるはずだった「空」または「ゼロサイズ」の画像を表しますが、画像形式では「ゼロ」寸法の画像を出力できないため、代わりに単一の透明なピクセル画像が使用されます。より明確に確認できるように、「ミス」画像の "identify" 出力と、単一の透明なピクセルのみを含むことを示すその単一ピクセル画像の「IM ピクセル列挙」を次に示します。

  magick identify crop_miss.gif
[IM Text]

  magick crop_miss.gif  crop_miss_data.txt
[IM Text]
この「ミス」画像は、基本的には "null:" 画像を作成するのと同じですが、元のソース画像のページまたは仮想キャンバスサイズ (ただしオフセットではない) と、GIF アニメーションのタイミング遅延など、他のすべての画像メタデータが設定されています。ただし、GIF ディスポーザル方法は、crop 後もアニメーションが正しく維持されるように変更される場合があります。基本的に、"-crop" やその他同様に関連するオペレーターが、特別な「ミス」画像を生成する可能性があることに留意する必要があります。したがって、そのような最小の画像が可能で、問題を引き起こす可能性がある場合は、IM を使用してスクリプトを作成するときに、警告メッセージまたはこの特別な「ミス画像」を探すように計画する必要があります。警告メッセージが必要ない場合 (たとえば、時折発生する「ミス」画像を予期して処理する場合) は、コマンドラインに "-quiet" 操作制御設定を追加できます。これにより、IM は情報警告メッセージのみを出力し、実際のエラーのみを出力するように指示されます。現時点では、現在の画像シーケンスから「ミス」画像または "null:" 画像を削除する方法はありません。ただし、このような方法は IM の将来のリリースで提案されています。このような方法が必要な場合は、メールしてください。

既存の仮想キャンバスを持つ画像を Crop する

画像に既存の仮想キャンバス (たとえば、GIF アニメーションのフレーム) が既にある場合、"-crop" 操作は仮想キャンバスを基準にして適用され、実際の画像には適用されません。つまり、キャンバス上の crop された画像の実際のピクセルデータのオフセットを保持しようとします。つまり、crop 前の特定のピクセルは、後で仮想キャンバスを基準とした同じオフセットに配置されている必要があります。このようにして、レイヤー化された画像や GIF アニメーションの crop は、「キャンバス」自体が crop されなかった場合でも、正しく動作し続けます。ここでは、ページキャンバスの中央に配置された画像を作成し、さまざまな方法で crop します。以前と同様に、キャンバスサイズ自体は操作によって変更されません。

  magick rose: -shave 12x0 -repage 64x64+9+9  paged.gif
  magick paged.gif -crop 32x32+16+16  crop_page.gif
  magick paged.gif -crop 32x32+0+0    crop_page_tl.gif
  magick paged.gif -crop 32x32+32+32  crop_page_br.gif
  magick paged.gif -crop 60x60+2+2    crop_page_all.gif
  magick paged.gif -quiet -crop 32x32+56+56  crop_page_miss.gif

magick identify paged.gif crop_page.gif crop_page_tl.gif crop_page_br.gif \ crop_page_all.gif crop_page_miss.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
[IM Text]
上記の最後の例は、もちろん特別な画像切り抜きミスの例でした。IMからの通常の警告メッセージを "-quiet" 設定で抑制したことに注意してください。何が起こっているのかをより詳しく見るために、画像の右下隅のページ分割された切り抜きを詳しく見てみましょう。ここでは、切り抜かれた領域の上に半透明の正方形を描画しました。

  magick paged.gif -page 64x64+32+32 -size 32x32 xc:'#fff8' \
          -alpha set  -background none  -mosaic    crop_area_br.png
[IM Output] ==> [IM Output] ==> [IM Output]
ここから、何が起こっているのかがわかります。切り抜きはページキャンバス内に完全に含まれていますが、切り抜きは実際の画像を完全には覆っていませんでした。その結果、実際の画像はユーザーが意図したよりも小さくなりますが、それでもより大きなキャンバスまたはページに配置されます。

結果から仮想キャンバスを削除する

この仮想キャンバス情報が不要な場合は、特別な "+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] ==> [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
これはもちろん、IMの新規ユーザーが "-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

  magick identify rose.gif  crop_vp.gif crop_vp_br.gif crop_vp_tl.gif \
              crop_vp_all.gif  crop_vp_miss.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
[IM Text]
'!' 文字は、"csh" のような一部のUNIXシェルでは特別な意味を持ち、引用符で囲まれていても、バックスラッシュでエスケープする必要があります。
返された画像のキャンバスサイズが、画像が切り抜かれた領域と一致するようになったことに注意してください。実際の画像内に完全に含まれる画像の切り抜きの場合、結果は切り抜きの後に "+repage" を実行することと同じになります。ただし、画像の切り抜きが部分的またはミスした場合、結果はキャンバスが大きくなり、結果の画像にオフセットが生じる可能性があります。そのため、これは切り抜きの後にページ/キャンバス情報をリセットするために "+repage" を実行する代わりにはなりません。ただし、'ビューポート切り抜き' の後に平坦化を実行して、画像の新しい仮想キャンバスを実際のピクセルで「塗りつぶす」ことができます。つまり、要求された切り抜きのサイズが保証された画像が残り、「ミスした」領域は現在の "-background" カラーの「ビューポート」で塗りつぶされます。
たとえば、画像のパディングを行う場合。

  magick rose: -crop 100x100-15-25\! -background skyblue -flatten \
          crop_viewport.gif
[IM Output]
ビューポート切り抜きの後に画像を平坦化することは、実際には範囲オペレーター(以下参照)を使用して「パディングされた切り抜き」を提供することと同じです。 'ビューポート切り抜き' フラグは、GIFアニメーションを切り抜く場合にも非常に重要です。キャンバスサイズを調整するだけでなく、すべての画像フレームが切り抜かれた領域内に正しく配置されるようにするためです。このオプションがないと、GIFアニメーションの切り抜きは非常に難しく、画像キャンバスのサイズとオフセットの外部補正が必要になります。この例については、キャンバス付きアニメーション切り抜きを参照してください。多くの点で、'ビューポート切り抜き' は、結果の画像への「ウィンドウ」のように機能するという点で、特別なビューポート歪み設定と密接に関連しています。どちらも「切り抜き」方法として使用できます。
'!' フラグは、複数の画像を生成するタイル状の切り抜きの場合、または異なる意味を持つ等しい領域のタイル状の切り抜きの場合には使用できません。以下の該当セクションを参照してください。

重力に対する相対的な切り抜き

"-crop" のオフセット位置は、デフォルトでは画像の左上隅を基準にします。ただし、"-gravity" 設定を設定することにより、"-crop" が画像の中心、隅、または端を基準に画像を切り取るように指示できます。重力を利用した切り抜きの最も一般的な使用方法は、画像の 'center' を切り抜くことです。

  magick rose: -gravity Center  -crop 32x32+0+0 +repage  crop_center.gif
[IM Output]
"-gravity" 設定は、切り抜きの最初の 'ゼロ' 位置に影響を与えるだけでなく、切り抜きオフセットの方向にも影響を与えます。たとえば、'South' の "-gravity" を使用すると、'+0+5' のオフセットは、通常のように下ではなく、切り抜き領域を上にオフセットします。

  magick rose: -gravity South  -crop 20x20+0+5   crop_south.gif
[IM Output]
上記の切り抜き例の位置に注意してください。"+repage" 操作を意図的に省略して、切り抜き領域が画像の下端からどのように移動したかを確認できるようにしました。また、切り抜き領域が下端(南部)を基準にしているだけでなく、領域が下端の中央になるように中央に「揃えられている」ことにも注意してください。これは、すべての重力の影響を受ける操作で実行されます。

画像のパーセンテージを Crop する

"-crop" オペレーターは、画像の元のサイズのパーセンテージのみに画像を切り抜く方法も理解しています。たとえば、これにより画像のサイズが半分になります。

  magick rose:  -crop 50%x+0+0      crop_half.gif
[IM Output]
サイズの数値が1つだけ指定されている場合、その値は幅と高さの両方のパーセンテージに使用され、切り抜かれる領域の最終的なサイズは最も近い整数に丸められます。オフセットはオプションではありません。
サイズはパーセンテージにすることができますが、オフセットは常にピクセル単位であることに注意してください。画像のサイズのパーセンテージとしてオフセットを指定することはできません。

  magick rose:  -crop 50%x+30+20      crop_percent.gif
[IM Output]
オフセットを指定して切り抜きを行う場合は、引数を正しく解釈できるように、引数に 'x' 記号を必ず指定する必要があります。これは、切り抜き領域の幅と高さの両方に対して1つの数値のみが指定されている場合に特に重要です。

そのため、'50%+30+20 のような引数はエラーとなり、切り抜きが何もせずに黙って終了する結果になります。
より一般的には、パーセンテージ切り抜きは画像の中心から行われます。

  magick rose: -gravity Center -crop 50x80%+0+0  crop_percent_center.gif
[IM Output]
パーセント記号 '%' は引数のどこにでも表示でき、指定された場合は幅と高さの両方の数値を参照します。これは、「画像サイズ」部分が画像の仮想キャンバスまたはページサイズのパーセント分率であることを宣言するフラグです。オフセットは常にピクセル単位で指定されます。
パーセント切り抜きで 'ビューポート切り抜き' フラグを使用して、切り抜きのキャンバスサイズとオフセットを、切り抜かれる領域に自動的に設定することもできます。

  magick rose: -gravity Center -crop 50%\!  crop_percent_vp.gif
[IM Output]
タイル切り抜き(次を参照)にパーセントサイズを使用することはできません。そのため、オフセットが指定されておらず、パーセントサイズが指定されている(上記のように)場合は、+0+0のオフセットが想定されます。

'!' フラグは、"+repage" が不要であることを意味します。ただし、仮想キャンバスのサイズとオフセットも持つ可能性のある入力画像には注意が必要です。

タイル Crop、1 つの画像を複数の画像に分割する

切り抜きのより便利な側面の1つは、切り抜きコマンドに特定の位置を指定しない場合です。つまり、画像の切り抜く位置ではなく、サイズを指定します。この場合、切り抜きは1つの画像のみを生成するのではなく、一連の画像を生成します。


magick rose: -shave 12x0 -repage 64x64+9+9 paged.gif
magick paged.gif +gravity -crop 32x32 tiles_%d.gif
magick identify paged.gif tiles_?.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output]
[IM Text]
画像から特定の数のタイルを抽出したいだけの場合は、以下のほぼ同じサイズの分割に切り抜くを参照してください。
"+gravity" を使用して、重力がオフになっていることを確認することをお勧めします。これは、1つの特別なケース(中心のパーセンテージ切り抜き)では、重力設定がタイル切り抜きをオフにする可能性があるためです。タイル状の切り抜きに対する重力の他の影響も未定義です。
"-mosaic" または "-flatten" 画像レイヤー演算子(レイヤーの平坦化を参照)を使用すると、これらの画像をすべて重ねて、元の画像を復元できます。

  magick tiles_[0-3].gif -background white -mosaic  tiles_mosaic.gif
[IM Output]
ただし、ご覧のとおり、画像の仮想キャンバスは "-mosaic" によって背景色で塗りつぶされています。別の方法として、"-layers merge" (レイヤーのマージを参照)を使用します。これにより、複数のレイヤー画像が、指定されたすべての画像を保持するのに十分な大きさの新しいレイヤー画像にマージされます。つまり、"-mosaic" または "-flatten" のレイヤー方式のように、仮想キャンバスは塗りつぶされません。

  magick tiles_[0-3].gif -background none -layers merge  tiles_layered.gif
  magick identify tiles_layered.gif
[IM Output]
  [IM Text]
"+repage" を使用してキャンバスとオフセット情報をリセットした場合、画像には切り抜かれた位置からのオフセットも、元のソース画像の元のサイズも含まれなくなります。その場合、"magick montage" の特別な「連結」モードを使用して、すべての画像を再度結合できます。モンタージュに、元の画像から抽出された画像の行数または列数を指示する必要があります。

  magick rose: -crop 20x20  +repage  +adjoin  rose_tiles_%02d.gif
  montage -mode concatenate -tile 4x  rose_tiles_*.gif   rose_rejoined.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output] [IM Output]
==> [IM Output]
個々の画像のファイル名は、"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"
[IM Output] ==> ==> [IM Output] [IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output] [IM Output]
これにより、タイル画像のファイル名が "rose_tile_1_1.gif" から "rose_tile_4_3.gif" まで生成され、はるかに優れたファイル命名規則になります。トリッキーですが、機能します。残念ながら、パーセントエスケープで生成された数値をフォーマットして、ゼロでパディングしたり、浮動小数点以下の桁数を指定したりすることはできません。少なくとも今のところは。

中央揃えタイルクロップ

IMフォーラムのディスカッションで、残りの画像をエッジの周りに均等に分散させるために、タイルクロップを中央揃えにするというリクエストがありました。これを行うことで、完全なタイルを画像の中央に配置することで、完全なタイルの効果を最大化します。もちろん、不完全なエッジタイルも多くなります。解決策は、入力画像を、必要なタイルサイズの倍数である仮想キャンバスの中央に配置することでした。たとえば、"rose:" 画像 (サイズ 70x46 ピクセル) を、画像の中央にある最大数の完全な 30x20 タイル (および残りのタイルで囲まれている) にタイルクロップするには、次のようにします。
  1. まず、画像のサイズを分割して、画像から取得できる完全なタイルの数を計算します...
    70x46 / 30x20 => 2x2 full tiles + remainder
  2. 次に、残りの画像 (必要な場合) を保持するために、さらに 2 つの行と列を追加します
    2x2 + 2x2 => 4x4 tile images
  3. タイルサイズにこれを掛けて、仮想キャンバスサイズを取得します。
    30x20 * 4x4 => 120x80 canvas size
  4. 元の画像サイズを差し引き、中央揃えオフセットのために 2 で割ります。
    ( 120x80 - 70x46 ) / 2 => +25+17
したがって、仮想キャンバスと中央揃えオフセットは 120x80+25+17 です。そしてここで、上記の計算を使用して、中央揃えタイルクロップを実行します...

  magick rose: -repage 120x80+25+17 -crop 30x20 +repage rose_30x20_%02d.gif
[IM Output] ==> ==> [IM Output] [IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output] [IM Output]
タイルの元のオフセット位置を保持したまま、中央揃えオフセットを削除する場合は、"-repage -25-17\!" を使用して相対オフセット調整を行うことができます (上記の "+repage" を置き換えます)。タイルの数に行と列を2つ追加しなかったためにマイナスのオフセットが生成された場合は、残りのエッジタイルを事実上無視し、画像内に存在する完全なタイルのみを出力できます。

  magick rose: -repage 60x40-5-3 -crop 30x20 +repage rose_ctiles_%d.gif
[IM Output] ==> ==> [IM Output] [IM Output]
[IM Output] [IM Output]
基本的に、残りのタイルは計算された仮想キャンバスの「外側」にあるため、"-crop"演算子はそれらがそこにあったことを認識せず、無視します。再び上記の"+repage"を、否定されたオフセット値"-repage +5+3\!"を使用した相対オフセット調整で置き換えると、タイルがクロップされた元のオフセット位置が復元されます。中央揃えタイルクロップで残りのタイルを無視する別の方法は、仮想キャンバスの設定を適切なクロップに置き換えるだけです。

  magick rose: -gravity center -crop 60x40+0+0 +gravity +repage \
          -crop 30x20 +repage rose_ctiles2_%d.gif
[IM Output] ==> ==> [IM Output] [IM Output]
[IM Output] [IM Output]
上記の方が理解しやすいですが、2つのクロップを実行しているため、少し遅くなります。ただし、必要な計算は少なくなります。ただし、元のタイルオフセットを復元する場合は、必要な相対オフセットを計算する必要があるため、画像の仮想キャンバスを使用する前者の高速な方法でタスクを実行することもできます。

ストリップ Crop、行と列を切り取る

IMバージョン6.1.1では、"-crop"が拡張され、サイズ引数の1つが欠落しているか、ゼロに設定されている場合、欠落しているサイズ引数が画像キャンバス/ページのサイズに設定されるようになりました。ほとんどの場合、関連するオフセットもゼロに設定されている場合は、キャンバス上の画像を含めるのに十分な大きさです。このわずかな変更により、画像のサイズをカバーするために '999999'のような大きな数値を使用することなく、画像から1つの行または列を簡単に切り取ることができます。たとえば、ここでは、ページ化されたローズ画像から単純な行と列を抽出します。


magick rose: -shave 12x0 -repage 64x64+9+9 paged.gif
magick paged.gif -crop 20x0+30+0 strip_column.gif
magick paged.gif -crop 0x20+0+30 strip_row.gif
magick identify paged.gif strip_column.gif strip_row.gif
[IM Output] ==> [IM Output] [IM Output]
  [IM Text]
両方のオフセットと1つのサイズ引数を削除すると、画像はタイルではなく、一連のストリップまたは列に分割できます。


magick rose: -crop 40x30+10+10 crop.gif
magick crop.gif -quiet -crop 20x strips_%d.gif
magick identify crop.gif strips_?.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output]
  [IM Text]
タイルクロップ(ストリップクロップも同様)は、画像のページキャンバス全体で行われるため、そのキャンバスに揃えられ、実際の画像だけには揃えられないことに注意してください。そのため、上記の例で生成された最初の実際の画像と最後の実際の画像は、幅が10ピクセルしかありません。もちろん、特定のタイル(この場合は「列」)が仮想キャンバス上の実際の画像を見逃した場合(上記の最後の画像など)、クロップミス画像が生成されます。IMが通常生成するはずだった警告は、"-quiet"設定を使用して抑制されました。このようなイベントを予想し、スクリプトのようにそれに備えている場合を除き、これは推奨されません。
画像が独自のページや仮想キャンバスに表示されないように配置されたり、ページキャンバスに画像の一部しか含めることができないほど大きい場合があります。

このようなまれなケースでは、サイズ引数のないストリップクロップは、画像の下位区分を誤って取得し、それぞれ、ミス画像、または仮想キャンバスの境界内の一部の小さなタイルを生成します。

ただし、"-crop"演算子は、これらのまれな特殊ケースを処理するように修正されることはありません。そうすることで、以下に示すような他のケースでの使用が妨げられるためです。

これが問題になる場合は、タイル画像を生成する前に、"+repage"を使用して仮想キャンバスを削除することにより、クロップする前に画像のページオフセットをサニタイズします。
画像を別々の行に分割する別の方法として、特別なスクリプト"divide_vert"を見てください。このプログラムを使用すると、水平方向の単色の「ギャップ」に従って画像を分割できます。たとえば、単純なテキストの画像が与えられた場合、「線」と「ギャップ」の交互の画像に分割します。簡単なオプションを使用すると、それらのギャップを削除できます。

象限、単一の点を中心に切り取る

クロップサイズ番号が欠落している場合は、クロップしている画像の画像キャンバスのサイズで置き換えられます。ほとんどの場合、その次元の画像全体がクロップ結果の一部になるはずです。これにより、引数を慎重に使用することで、特定の点を中心とした画像を4分割する機能が実現されます(その特定のピクセルが左下象限画像の右上ピクセルとして配置されます)。これを行うために画像のサイズを知る必要はありません。たとえば、ここでは、ポイント 30,40 を中心に画像を 4 つの象限にクロップします。


magick rose: -shave 12x0 -repage 64x64+9+9 paged.gif
magick paged.gif -crop 30x40+0+0 quadrant_tl.gif
magick paged.gif -crop 0x40+30+0 quadrant_tr.gif
magick paged.gif -crop 30x0+0+40 quadrant_bl.gif
magick paged.gif -crop +30+40 quadrant_br.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output]
もちろん、クロップするポイントが実際の画像を見逃した場合、結果として生じる象限画像の2つまたは3つが、特別なクロップミスエラー画像になります。

負のオフセットを使用して、下または左端を削除する

"-crop"で負のオフセットを使用しない理由はありません。実際、時々非常に明確な利点があります。たとえば、ページ化されたローズ画像を取得し、より大きな負のオフセットで段階的にクロップしてみましょう。"-crop"引数に画像サイズを指定しないため、画像のキャンバスサイズがデフォルトになります。


magick rose: -shave 12x0 -repage 64x64+9+9 paged.gif
magick paged.gif -crop -10-10 neg_offset_1.gif
magick paged.gif -crop -20-20 neg_offset_2.gif
magick paged.gif -crop -30-30 neg_offset_3.gif
magick paged.gif -crop -40-40 neg_offset_4.gif
magick paged.gif -crop -50-50 neg_offset_5.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
ご覧のとおり、オフセットをより大きな負の値に徐々に減らすと、下端と右端が徐々に「切り落とされ」、最後の例では実際の画像をほとんど見逃しています。これをさらに一歩進めると、ミス画像が生成されます。"-chop"演算子を使用するのに似ていますが、"-gravity"設定はありません。エッジの削除を参照してください。もちろん、"-crop"を使用する場合は、キャンバス/ページ情報を調整するために"+repage"演算子を使用する必要がある場合がありますが、"-chop"ではそのような調整が自動的に実行されます。それが人生です。

ほぼ均等なサイズの分割に Crop する

タイルクロップの最大の問題は、各タイルの最終サイズのみを定義できることです。これは、画像のサイズが目的のタイルサイズの正確な倍数である場合に非常にうまく機能しますが、そうでない場合は、右端と下端に「短い」タイルが発生する可能性があることがわかりました。たとえば、組み込みのローズ画像を再度分割しますが、3x3タイルに分割してみましょう。元の画像は 70x46 ピクセルなので、3 で割ると各タイルは 23x15 ピクセルになります...

  magick rose: -crop 23x15  +repage  +adjoin  rose_23x15_%02d.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output] [IM Output]
ご覧のとおり、これはうまくいきませんでした。ローズ画像は3つの等しいサイズのタイルに正確に分割できないためです。この場合、1ピクセルの「短い」タイルになります。タイルのサイズを 24x16 ピクセルに拡大しても、他のタイルよりも 2 ピクセル「短い」タイルになります。この状況は、必要なタイルの数が多くなるにつれて悪化します。たとえば、長さ 100 を 30 個のタイルに分割してみてください。不可能です。長さ3を使用して34個のタイルを取得するか、4を使用して25個のタイルを取得します。正確に30個の等しいサイズのタイルを取得することは不可能です。IM v6.5.8-9 以降では、"-crop"引数に特別な'@'フラグを追加できるようになりました。このフラグは、指定されたタイルの数で画像を均等に分割するように最善を尽くすように、"-crop"演算子に指示します。たとえば...

  magick rose: -crop 3x3@  +repage  +adjoin  rose_3x3@_%d.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output]
結果として、画像はわずかに異なるサイズのタイルに分割されました。ただし、タイルサイズの差は最大でも1ピクセルになります。確認してください!ボーナスとして、各タイルが隣接するタイルと「重複」するように画像を細分化することもできます。これを行うには、'@'フラグを使用するだけでなく、必要な重複ピクセル数を指定します。たとえば、ローズを4分割しますが、20ピクセルの重複を使用してみましょう。

  magick rose: -crop 2x2+20+20@  +repage  +adjoin  rose_2x2+20+20@_%d.gif
[IM Output] ==> [IM Output] [IM Output]
[IM Output] [IM Output]
繰り返しますが、すべてのピースのサイズは最大で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 Output] ==> [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
==> [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
エッジ周辺の同じ間隔ここでは、サブイメージは6ピクセル間隔で「間隔を空けた」だけでなく、エッジの周りにも6ピクセルの間隔があり、見た目がすっきりとしています。これは、適切なピクセル「オーバーラップ」を指定して、デフォルトの 等間隔クロップを使用することで処理されます。例を挙げると...

  magick edged.gif -crop 5x1+6+6@ +repage +adjoin edged+6_%d.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
演算子が、画像が同じサイズを維持しながら、6ピクセルのオーバーラップを持たせるように画像を分離したことに注目してください。これはまさにそのように設計されたものです。負のオフセットを使用することで、IMに、オーバーラップ領域(間隔部分)を最終結果に含めないように指示します。

  magick edged.gif -crop 5x1-6-6@ +repage +adjoin edged-6_%d.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
さらにピクセルを減算すると、上記の数値から白い境界線の一部をトリミングすることもできます。

  magick edged.gif -crop 5x1-8-8@ +repage +adjoin edged-8_%d.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
シェーブ演算子の代替メソッドとして、1タイルのクロップを指定して使用することもできます...

  magick edged+6_0.gif -crop 1x1-6-6@ +repage tile-shave.gif
[IM Output] ==> [IM Output]
単純に間隔を空けたタイル最も単純な間隔を空けたタイル画像には、エッジ間隔がないか、そのエッジ間隔が画像からトリミングされています。ただし、これを処理するには、'@'と'!'の両方のフラグを含めることによって、この特殊な状況をIMに伝える必要があります。

  magick spaced.gif -crop 5x1+6+6@\! +repage +adjoin spaced+6_%d.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
このサブ分割のエッジにある画像は、中央にある画像よりもわずかに短いことに注意してください。これが、この特別な「モード」の動作が、前の間隔を空けたタイルのカテゴリよりも実際には単純であるにもかかわらず、デフォルトではない理由です。また、'@'と'!'の両方のフラグを使用する場合、単一タイルのクロップ(この場合は垂直方向)は効果がありません。タイルの上部と下部の両方が「エッジ」であり、削除する「エッジスペース」がないためです。ここでも、オーバーラップに負の値を使用することで、タイルクロップの結果にオーバーラップ(間隔)領域を含めないようにIMに指示できます。

  magick spaced.gif -crop 5x1-6-6@\! +repage +adjoin spaced-6_%d.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
'!' 文字は、"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] [IM Output] [IM Output] [IM Output] [IM Output]
上の最後の例の画像に注目してください。境界線の色は透明色「none」に設定しましたが、これが期待どおりに機能するためには、画像に実際に「マット」または「アルファ」チャンネルが含まれていることを確認する必要がありました。また、垂直方向と水平方向の境界線のサイズが同じ場合は、境界線の2番目の数字を省略し、1つの数字のみを使用できることに注意してください。
上記のように、 "-border" 演算子によって使用されるデフォルトの色は、WWW上のWebページのデフォルトのグレーページの色とよく一致する薄いグレーです。
境界線を画像のサイズのパーセンテージとして指定できます...

  magick rose: -border 10%x10%  border_percent.jpg
[IM Output]
内部的には、実際には、 "-border" は、正しいサイズの新しい画像を作成し、その新しい背景の上に元のソース画像をオーバーレイしています。これは、ImageMagick自体の中でも、透明および半透明の画像の背景を設定するために非常に役立つ操作です。つまり、一見役に立たない "-border 0" 操作は、IMバージョン6では非常に役立つ操作です。例を挙げると...

  magick star.gif -bordercolor LimeGreen -border 0  star_background.gif
[IM Output] ==> [IM Output]
もちろん、アルファ透明度を削除する方法は他にもたくさんあります。
透明度を持つ画像に境界線を追加すると、デフォルトで画像の透明な背景も塗りつぶされるという事実は、IMユーザーと開発チームの間で議論の的となっていました。この議論の概要については、境界線、フレーム、および BorderColor の使用で説明しています。

境界線とアルファ合成

境界色キャンバスへの画像のオーバーレイは、 "-compose" 設定によって制御されます。この設定はデフォルトで 'Over' アルファ合成に設定されています。他の設定に変更されている場合、 "-border" 操作は予期しない結果を生み出す可能性があります。たとえば、透明領域を含む画像に適用した場合の "-compose" と "-border" 画像演算子の興味深い使用例を次に示します。

  magick star.gif -bordercolor LimeGreen \
                   -compose {operation} -border 5  {result}
[IM Output]
'Over' と 'Copy' のどちらを使用するかは、基本的に、画像の透明度を保持するかどうかを決定します。たとえば、透明度を持つ同じ「星」の画像ですが、今回は画像の透明度を損なうことなく境界線が追加されています。

  magick star.gif  -bordercolor LimeGreen   -compose Copy \
                     -border 5     star_border_copy.gif
[IM Output]
'Src' 合成は、現在の "-bordercolor" 設定に関係なく、画像に透明な境界線を追加します(アルファチャンネルがある場合)。基本的に、生成された背景キャンバス "-border" は無視されます。 'Dst' はあまり役に立たないように見えるかもしれませんが、元の画像と同じサイズ(または少し大きい)のキャンバスを生成するために使用できます。元の画像は、キャンバスの最終サイズを決定するためだけに使用されます。詳細については、既存の画像に合わせてサイズ調整されたキャンバスを参照してください。さまざまな "-compose" メソッドの詳細については、アルファ合成の例を参照してください。

境界線と仮想キャンバス

仮想キャンバスを含む画像に "-border" を適用すると、仮想キャンバス上の実際の画像の周囲に境界線が追加されます。キャンバス全体には追加されません。


magick rose: -shave 12x0 -repage 64x64+9+9 paged.gif
magick paged.gif -border 5x5 paged_border.gif
[IM Output] ==> [IM Output]
仮想キャンバスのサイズも、追加された境界線に合わせて境界線の厚さの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] [IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output] [IM Output]
複数のフレーム操作を使用すると、より奇妙なフレーミングスタイルも生成できます。

  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] [IM Output] [IM Output] [IM Output]
デフォルトの "-mattecolor" は、デフォルトの "-bordercolor" 設定よりもわずかに暗いグレーです。これにより、WWW上のWebページのデフォルトのグレー色(「mosaic」や「netscape」などの初期のブラウザーで使用)と一致させることもできます。(下記参照)
"-frame" は実際には "-mattecolor" カラーを使用する可能性がありますが、フレームの描画に使用するために、このベースからさらに4つの追加の色を生成します。つまり、画像には1つだけでなく、5つの関連色が追加される可能性が高くなります。
多少の努力をすれば、テキストラベル付きの "magick montage" のようなフレーム付き画像を再現することもできます。

  magick rose:  -mattecolor grey  -background grey  -frame 3x3+0+3 \
          -gravity South -splice 0x15 -annotate 0x0 'A Red Rose' \
          -frame 6x6+3+0    frame_montage.gif
[IM Output]
フレームの「-frame」には、半透明の「-mattecolor」を使用することもでき、さらに(フラクタルプラズマキャンバスなどの)面白いパターンを「下敷き」にして、よりカラフルなフレームを作成できます。


magick rose: -alpha set -mattecolor '#CCC6' -frame 10x10+3+4 \ \( -size 100x100 plasma:fractal -normalize -blur 0x1 \) \ -compose DstOver -composite frame_plasma.gif
[IM Output]
あるいは、フレームを別々に着色することもできます(特別な「Dst」合成設定を使用して生成します)。フレームを着色したら、その上に画像を重ねます。しかし、それは非常にトリッキーです。フレームのより高度なテクニックについては、フレームテクニックを参照してください。

フレームとアルファ合成

フレームは「-border」演算子と密接な関係があります。フレームは「-mattecolor」を使用して描画されるだけでなく、この演算子はフレームが最初に描画される背景を定義するために「-bordercolor」設定も利用します。透明度がない画像の場合、「-bordercolor」は画像自体によって重ねられるため、表示されません。しかし、透明な領域を含む画像の場合、背景色が可視になります。

  magick star.gif  -frame 6x6+2+2 star_framed.gif
[IM Output]
言い換えれば、「-frame」は、画像を単色の背景を持つ額縁に重ねるように機能します。そのため、画像の透明な部分は、「-bordercolor」(デフォルトでは薄い灰色)に置き換えられます。
透明度のある画像にフレームを追加すると、デフォルトで画像の透明な背景がボーダーカラーで塗りつぶされるという事実が、IMユーザーと開発チームの間で議論を引き起こしました。この議論の概要は、ボーダー、フレーム、およびBorderColorの使用に記載されています。
フレームを付けながら画像の透明度を保持したい場合は、2つの解決策があります。1つ目は、「none」などの透明な「-bordercolor」を使用することです。

  magick star.gif -bordercolor none  -frame 6x6+2+2  star_framed_none.gif
[IM Output]
もう1つの解決策であり、推奨される方法は、画像をフレームに追加するときに透明なピクセルが保持されるようにすることです。これは、「Copy」という特別な「-compose」メソッドを使用することで実現できます。

  magick star.gif -compose Copy  -frame 6x6+2+2  star_framed_copy.gif
[IM Output]
-bordercolor」を「-border」と「-frame」の両方の背景画像として使用する方法は、IMバージョン6.1.4で追加されました。それ以前は、生成された背景キャンバスは、ボーダーまたはフレームが描画される黒いキャンバスで構成されていました。

この黒色の使用は、「magick montage」コマンドで特に問題がありました。このコマンドは、内部処理で内部の「-frame」関数を多用するためです(モンタージュの背景と透明度の処理を参照)。
ご覧のとおり、「-frame」演算子は、「-border」と同様に、「-compose」設定を使用して、ソース画像が背景フレームにどのように重ねられるかを定義します。

  magick star.gif -bordercolor LimeGreen \
          -compose {operation} -frame 6x6+2+2  {result}
[IM Output]
Copy」の「-compose」設定の使用は、「magick montage」フレームで「-bordercolor」設定も使用したい場合に非常に重要になります。詳細については、モンタージュの背景と透明度の処理を参照してください。

フレームと仮想キャンバス

ボーダーと仮想キャンバスと同様に、フレームも仮想キャンバス上の実際の画像の周囲に適用され、キャンバス全体には適用されません。


magick rose: -shave 12x0 -repage 64x64+9+9 paged.gif
magick paged.gif -frame 5x5+2+2 paged_framed.gif
[IM Output] ==> [IM Output]
仮想キャンバスのサイズは、追加されたフレームに対応するためにボーダーの厚さの2倍にも増加したことに注意してください。もちろんこれは、アニメーションの個々のサブフレームを実際に識別したい場合を除き(たとえば、アニメーションフレームのモンタージュを参照)、一般的な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] ==> [IM Output] [IM Output] [IM Output]
これら3つの演算子に関して覚えておくべき主なことは、画像の片側または隣接する側だけでなく、反対側のスペースを追加および削除することです。画像の一方のエッジのみを削除したい場合は、「-chop」演算子を使用する必要があります(下記のチョップの例を参照)。以前と同様に、「-border」、「-frame」、および「-shave」のすべての演算子は、仮想キャンバス上の実際の画像のみに影響し、仮想キャンバス自体には影響しません。


magick rose: -shave 12x0 -repage 64x64+9+9 paged.gif
magick paged.gif -border 5x5 paged_border.gif
magick paged_border.gif -frame 5x5+2+2 paged_frame.gif
magick paged_frame.gif -shave 10x10 paged_shave.gif
[IM Output] ==> [IM Output] ==> [IM Output] ==> [IM Output]
シェーブの代わりに、新しい等しいサイズのタイルクロップ演算子を使用することもできます。この演算子の利点は、「-shave」とは異なり、結果として得られる画像のキャンバスサイズを変更しないことです。

  magick paged_frame.gif   -crop  1x1-10-10@     paged_tile_shave.gif
[IM Output] ==> [IM Output]
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] [IM Output] [IM Output] [IM Output]
ご覧のとおり、画像に追加された新しい領域は、「-background」色で塗りつぶされます。
IMバージョンv6.3.2より前は、「-extent」は新しい領域のメモリをゼロまたは真っ黒にクリアしただけでした。領域を「-background」色で塗りつぶしませんでした。
また、IM v6.3.2以降、「-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] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
上記の最後の例は、エクステントが「-repage」を必要とせずに中央揃えのクロップも実行できることを示していますが、現在の「-background」色で画像を「フラット化」します。
オフセットを使用することもできます。これは基本的に、エクステント演算子が、位置に関係なく、背景パディングでクロップを簡単に行うことを意味します。

  magick rose: -background skyblue -extent 100x100-15-25 extent.png
[IM Output]
この重力に従って画像をクロップおよび拡張する機能により、たとえばサムネイルをパディング/塗りつぶししてフィットさせるを参照して、特定のサイズの領域に収まるように画像をパディングまたはクロップするのに最適な演算子になります。-extent」は、ボーダーフレームの両方の演算子が使用するのと同じ「オーバーレイ」手法を使用して機能することに注意してください。そのため、デフォルトで透明度を含む画像で使用すると、透明度が現在の「-background」色に置き換えられます。

  magick star.gif  -background LimeGreen  -extent 80x80-10-10  star_extent.gif
[IM Output]
この解決策も、「-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] ==> [IM Output] [IM Output] [IM Output] [IM Output]
背景色が設定されていない場合、IMは画像自体からこの値を判断しようとします。これは、一部の画像では白(通常のデフォルト)になる可能性があり、他の画像では黒、GIF形式では、画像が保存されたときに設定された背景色が何であれ、そうなる可能性があることを意味します。

基本的にこれが意味することは、「-background」色を設定しない場合、そのデフォルト値は画像によって異なり、ほぼ何でも取得できるということです。

それを使用する演算子を使用する前に、常に「-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] [IM Output] [IM Output] [IM Output] [IM Output]
スプライスの最も一般的な使用法の1つは、ラベルを描画するためのスペースを追加することです(画像のラベル付けを参照)。

  magick rose: -gravity South  -background LimeGreen  -splice 0x15 \
           -annotate 0x0 'Rose'    splice_label.gif
[IM Output]

チョップ、行、列、エッジの削除

-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] ==> [IM Output] ==> [IM Output] ==> [IM Output]
描画やオーバーレイを使用せずに画像の中央から行または列(またはその両方)を「クリア」するために、「-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] ==> [IM Output] [IM Output] [IM Output] [IM Output]
単一のエッジを削除するために "-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] ==> [IM Output] [IM Output] [IM Output] [IM Output]
これは、"-crop" に削除する画像領域が指定されていない場合、画像キャンバスのサイズ(実際の画像ではなく、画像の仮想キャンバス)がデフォルトになるという事実に依存しています。つまり、(単純な画像の場合)切り取るクロップ領域をオフセットするだけで、画像の端を削除できます。"-crop" を使用して画像の端を「chop」する方法は、Don Sheythe によって発見および公開され、議論の結果、IM の「機能」と見なされ、ここに含められました。

高度なクロッピングテクニック

指定されたアスペクト比で Crop する

特定の縦横比に合わせて画像をクロップできますが、これはトリッキーで、DIY の数学的テクニックをいくつか使用します。たとえば、計算を実行してから クロップを実行するスクリプトを作成できます。または、IM v6 では、ディストート ビューポートを使用して計算を行い、No-Op ディストーション中に画像の目的の部分を抽出できます。中央揃えの正方形クロップで説明されているように。ただし、ImageMagick バージョン 7 では、"-crop" や "-extent" などのコマンドで直接数学的計算を実行できるようになったため、"-distort" を誤用する必要がなくなりました。これについては、IM 開発者フォーラムの 縦横比に合わせてクロップで詳しく説明されています。

トリム、'自動クロップ'オペレーター

"-trim" オペレーターは、上記で説明した非常に汎用性の高い "-crop" オペレーターと非常に密接な関係があります。ただし、このオペレーターは引数を提供する代わりに、色や透明度が変化しない画像の境界線または端を削除しようとします。言い換えれば、画像の周囲にある「退屈な」部分を削除します。
ImageMagick バージョン 5 以前では、自動クロップ操作は、"-crop" オペレーターに「0x0」引数を使用することで実現されていました。現在、これは当てはまりません。クロップの「ゼロ」サイズの引数は、現在、「無限」または「画像サイズの限界まで」を意味します。

したがって、クロップに対する「0x0」引数は、現在、画像を元の画像キャンバスのサイズのタイルにクロップすることを事実上意味します。言い換えれば、IM v6 では、結果は元の画像と同じ、つまり「no-op」になります。

たとえば、ここでは IM ロゴを取り上げ、サイズを変更し、ロゴの周囲の余分なスペースをすべて「トリム」または「自動クロップ」します。

    magick logo: -resize 30%    -trim     trim.gif
上記から2つのことを注意する必要があります。1つ目は、"-crop" と同様に、"-trim" は画像のキャンバスサイズを保持します。つまり、トリムの数値引数を抽出して、画像処理のさらなる処理または調整を可能にすることができます(この例については「ノイズの多い」画像をトリミングを参照してください)。
[IM Output]
ここでは、画像をトリムしますが、トリミングされた実際の画像ではなく、画像のどの部分がトリムされたかの結果をリストするだけです。

  magick logo: -resize 30%   -trim  info:-
[IM Text]
ただし、この情報に関心がなく、単に "+repage" オペレーターを使用するか、キャンバス情報を保存しない形式(JPEG 形式など)で保存することによって、画像のページ情報をリセットして破棄するだけです。ここでは、キャンバス情報を破棄していることを明確にするために、両方を行います。

  magick logo: -resize 30%    -trim +repage    trim_repage.jpg
[IM Output]
2つ目に注意すべき点は、トリムが最終画像のまさに端までトリムされなかったことです。これは、ロゴ画像の右下隅で特に顕著であり、足とその影とトリムされたエッジの間に明確な隙間が見られます。この隅では、ここの色が画像の背景色と数値的に異なってきました。したがって、画像に実際的な変化は見られなくても、"-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" が苦労して維持したキャンバスオフセットも変更されます。そのため、仮想キャンバス情報を削除せずに結果を見ると、画像が移動していることがわかります。
[IM Output] ==> [IM Output] [IM Output] ==> [IM Output]

  magick stripes.gif -bordercolor red -border 1x1  -trim  \
           stripes_trim_red_shifted.gif
[IM Output]
そのため、特定の色のトリミング時に、仮想キャンバスのサイズ(border_widthx2を減算)とオフセット(border_widthを減算)を修正してみましょう。

  magick stripes.gif -bordercolor red -border 1x1  -trim  \
           -set page '%[fx:page.width-2]x%[fx:page.height-2]+%[fx:page.x-1]+%[fx:page.y-1]' \
           stripes_trim_red_fix.gif
[IM Output]
上記の境界線オペレーターが拡大および移動した元の画像のキャンバスサイズとオフセットを復元していることに注意してください。"-trim" 操作自体は、画像の場所を正しく保持しました。ご覧のとおり、かなり扱いにくい調整です。あるいは、キャンバスサイズに関心がない場合(レイヤー化された画像では一般的)、はるかに単純な相対リページを使用して、拡大されたキャンバス上の画像の​​位置のみを調整できます。

  magick stripes.gif -bordercolor red -border 1x1  -trim  \
           -repage -1-1\! stripes_trim_red_fix2.gif
[IM Output]

画像の片側のみをトリミング

上記で見たように、"-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
2つの異なる色のストライプを追加することに注意してください!このようにすることで、色の1つが画像を囲む既存の境界線の色と一致する場合、もう1つは3つのエッジを保護し続けることができます。また、色の一つだけがトリムされ、クリーンアップされる色のストライプが1つだけ残ります。次に、1つの側面をトリムするプロセス全体を1つのコマンドとして示しますが、上端(ストライプは下端または「南」端に追加されます)をトリミングする場合。
[IM Output] ==> [IM Output] ==> [IM Output] ==> [IM Output]

  magick border.gif -gravity South \
          -background white -splice 0x1  -background black -splice 0x1 \
          -trim  +repage -chop 0x1   trim_north.gif
[IM Output]
そして、これは下端のみをトリムしたものです。もちろん、前の例で使用した "-gravity" 設定は必要なく、設定は画像の「North-West」設定にデフォルト設定されます。

  magick border.gif \
          -background white -splice 0x1  -background black -splice 0x1 \
          -trim  +repage -chop 0x1   trim_south.gif
[IM Output]
もちろん、以前と同じように、境界線を使用して画像に余分な色を接ぎ木すると、仮想画像キャンバスのサイズとレイヤー画像のオフセットが再び変更されます。繰り返しますが、これは前のセクションで示したのと同じ方法を使用して修正できますが、それらのエッジを保持するために余分な色を追加した側によって異なります。

ファジーカラー選択を使用したトリミング-- 低品質の 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つの主要なコントロールが提供されます。
  • 無視したいほこりの斑点のサイズを決定する「-blur」シグマ半径、または「-median」畳み込み半径です。これらの値はどちらも浮動小数点数にできるため、適用するぼかしの量を細かく制御できることに注意してください。ぼかしの詳細については、画像のぼかしを参照してください。
  • 2番目のコントロールは、「-fuzz」カラーファクターであり、「-trim」演算子によって一致する色の変化量を制御します。つまり、トリムを目的の画像にどの程度近づけたいかを制御します。
たとえば、より小さな「logo:」画像を使用してみましょう。

  magick logo:   -resize 30%   noisy.jpg
この小さな画像では、画像内の星とタイトルを、トリムで無視したいノイズと見なすことができます。上記の星は約5ピクセル幅であるため、トリムで基本的にそれらを無視するために、その約2倍の値を使用したいと思います。
[IM Output]
結果は次のとおりです。この場合、画像は必要なく、画像からのキャンバス情報のみが必要であることに注意してください。

  magick noisy.jpg  -virtual-pixel edge -blur 0x15 -fuzz 15% -trim  info:
[IM Text]
ぼかしによる適切な「エッジ効果」を得るためには、仮想ピクセルの設定を確認する必要があるかもしれません。

または、ぼかしを適用する前に、画像の背景色と同じ色の幅広の境界線を追加し、オフセットの結果を適切に調整することもできます。これは、「-blur」および「-trim」演算子によるより正確な結果を得るのに適している場合があります。
上記の結果から、「-trim」は内部的に「-crop」の引数として「89x121+78+23」を使用していたと判断できます。これは、トリミングされた画像の実際のサイズと、仮想キャンバス上のオフセットであり、おそらく画像内にある、探している主要な(単一の)オブジェクトの位置です。
これは、ぼかしを適用していない元の画像で使用できます。

  magick noisy.jpg   -crop 89x121+78+23 +repage   noisy_trimmed.jpg
そして、ここでは画像をウィザードだけになるようにトリミングしました。
[IM Output]
これは、「UNIXシェルスクリプト」を少し追加し、最初のコマンドの結果を整形することで、1行で実行できます。

  magick noisy.jpg -crop \
    `magick noisy.jpg -virtual-pixel edge -blur 0x15 -fuzz 15% \
             -trim -format '%wx%h%O' info:`   +repage   noisy_trimmed_2.jpg
info:」の出力を制御するために使用される「-format」設定の詳細については、画像プロパティエスケープを参照してください。
[IM Output]
上記では、バッククォート「`...`」を使用した「コマンド置換」メソッドのUNIXコマンドラインシェル機能を使用して、生成された「-crop」引数を外側の「magick」コマンドに挿入します。

これは、特別なFOR..DO構文を使用して、Windowsバッチスクリプトで実行できます。詳細については、上記のリンクをたどってください。
ウィザードの手は完全に表示されていますが、帽子の先はそうではありません。これはこのメソッドの欠点であり、鋭い点や細かい詳細を無視します。しかし、それはそもそも無視するように要求していたことです。
この方法は、FXエスケープを使用して数学を行うことで、トリミングされた領域を少量(4方向に10ピクセル)拡大することで改善できます。

  magick noisy.jpg -crop \
      `magick noisy.jpg -virtual-pixel edge -blur 0x15 -fuzz 15% -trim \
               -format '%[fx:w+20]x%[fx:h+20]+%[fx:page.x-10]+%[fx:page.y-10]' \
      info:` +repage   noisy_trimmed_3.jpg
[IM Output]
計算された境界が元の画像を超えて拡大した場合、crop演算子は自動的に画像の境界に制限します。
IMv7(「magick」コマンドを使用)では、計算されたトリムサイズを後で使用するために設定に保存することで、すべてを1つのコマンドで実行できます。

  magick noisy.jpg \
         \( +clone -virtual-pixel edge -blur 0x15 -fuzz 15% -trim \
            -set option:fuzzy_trim \
                     '%[fx:w+20]x%[fx:h+20]+%[fx:page.x-10]+%[fx:page.y-10]'\
            +delete \) \
         -crop %[fuzzy_trim] noisy_trimmed_4.jpg
[IM Output]
ファジートリミングの他の方法としては、さまざまなモルフォロジーメソッドを使用して画像の不要な部分を削除してから、トリミングして元の画像で目的の領域の境界を見つける方法があります。ユーザーのHugoRuneは、スキャン目的でコントラストが大きく異なる領域まで画像をトリミングする必要がありました。詳細については、IMフォーラムでの議論を参照してください。