ImageMagick 使用例 -- 切り抜きと縁取り
- 基本の crop オペレーター
- ミスした画像(不正な切り抜きによる)
- 既存の仮想キャンバスを持つ画像の切り抜き
- 結果から仮想キャンバスを取り除く (+repage を使用)*
- 仮想キャンバスを調整するビューポート切り抜き
- グラビティを基準にした切り抜き
- 画像のパーセンテージで切り抜く
- タイル切り抜き、1 枚の画像を複数の画像に細分する
- 中央寄せタイル切り抜き、端に余りを残す
- ストリップ切り抜き、行や列を切り出す
- 四分割、1 点を中心に切り分ける
- 負のオフセットを使う、下端や左端を取り除く
- おおむね等しいサイズの区画に切り抜く
- Frame、画像に 3D 風の縁を加える
- Shave、画像から端を取り除く
- 特定の色で Trim する
- 画像の片側だけを Trim する
- 「ファジー」な画像を Trim する -- 低品質 JPEG 画像
- 「ノイズの多い」画像を Trim する -- スキャン画像やビデオ画像
ここでは、画像にメスを入れ、画像の周りにフレームや縁を加えることを可能にする ImageMagick の操作を見ていきます。つまり、画像の内容を拡大縮小せずに画像のサイズを変更する操作を見ていきます。これは単純な操作だと思うかもしれませんが、実際そのとおりです。あまりに単純なので、IM はこの作業を実際に行う方法や手段を非常に多く提供しています。あまりに多いため、それらをすべて実演するためにこの例集に独立したページを 1 枚割く必要があったほどです。
Crop(画像を必要なサイズに切り取る)
切り抜きとキャンバスページ
「[-crop](https://imagemagick.org/command-line-options/#crop)」画像オペレーターは、ジオメトリ引数で指定したサイズと位置に従って、現在のシーケンス内のすべての画像から指定部分を単純に切り出します。
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
ここで何が起きたかを正確に確認できるよう、上記の切り抜き結果に対して「magick identify」を実行した出力を示します。
magick identify rose: crop.gif crop_br.gif crop_tl.gif \
crop_all.gif crop_miss.gif
表示される画像のサイズ(その 仮想キャンバス)が「[-crop](https://imagemagick.org/command-line-options/#crop)」操作の影響を受けていないことに注目してください。実際の画像そのものは切り抜かれ、より小さくなっているかもしれませんが、GIF 画像が表示されるキャンバスのサイズは依然として元のキャンバスと同じです。また、切り抜きで生成される実際の画像のサイズが、要求したサイズどおりにならない場合があることにも気づくでしょう。切り抜き自体が、切り抜く対象である実際の画像領域の一部または全部の外側に位置していた場合、期待したよりもはるかに小さくなることがあります。さらに、多くの場合 仮想キャンバス 上の画像の「オフセット」も変更され、切り抜かれた画像のピクセルが元画像とまったく同じ位置に残るようになっていることにも気づくでしょう。つまり、実際の画像そのものが小さくなっても、画像の内容自体は移動しません。これは、より小さくなった画像を修正してから 画像レイヤー操作 で元画像の上に重ねると、その部分画像が元々あった場所にぴったり収まることを意味します。すなわち IM は、後で使用するために画像の「仮想キャンバス」「ページ」「レイヤー」情報を保持しています。これは特に GIF アニメーション処理を正しく機能させるために重要です。詳しくは GIF アニメーションの分解 を参照してください。 | _GIF 画像は、IM が切り抜いた画像の「ページ」または「仮想キャンバス」のサイズとオフセット情報を積極的に利用します。この情報が不要な場合は、「[-crop](https://imagemagick.org/command-line-options/#crop)」の直後に「[+repage](https://imagemagick.org/command-line-options/#repage)」で取り除いてください。
多くの画像形式はこの仮想ページ/キャンバス情報を保存しないため、そうした形式に保存すると自動的に取り除かれます。JPEG はこの情報を取り除く形式の典型例です。
PNG 形式はページ/キャンバス情報をあまり利用しません(マルチ PNG(MNG)形式を除く)が、ページオフセット情報(負のオフセットも含む)は保存します。IM はまた、後で他の IM コマンドが使用できるよう、仮想キャンバスサイズを保存するための少量のメタデータを追加します。
この保存の仕組みがあるため、その情報が不要な場合は、JPEG やその他のページを持たない画像形式に保存する場合でも、念のため、またその情報が不要であることを明示するために、やはり「[+repage](https://imagemagick.org/command-line-options/#repage)」を適用することを強く推奨します。
_
---|---
なお、切り抜きの挙動は次の defines によって影響を受けることがあります。
| trim:percent-background=X% | 端で許容される背景の量を設定します。パーセントで指定します。0% は背景をまったく許容しないことを意味します。50% は、ファジー係数に基づき、端に背景となるピクセルを最大 50% まで含められることを意味します。 |
|---|---|
| trim:edges={north,east,south,west} | 画像の指定した端だけを trim します。 |
| trim:minSize=geometry | trim を指定したサイズに制限します。 |
| type:features=string | 複雑なテキストレイアウト中に RAQM デリゲートが使用するフォント機能を追加します。これは通常、既定では有効になっていない任意のフォント機能を有効にするために使われますが、既定のフォント機能を無効にするためにも使えます。機能には、カーニング、合字、アラビア文字を制御するものが含まれます。 |
| type:hinting=false | フォントヒンティングを無効にします。グリフを適切にレンダリングするには、スケールされたポイントを対象デバイスのピクセルグリッドに沿って整列させる必要があり、この処理はしばしばヒンティングと呼ばれます。その主目的の 1 つは、重要な幅と高さがフォント全体を通して尊重されるようにすることです。(たとえば、‘I’ と ‘T’ のグリフの中央の縦線が同じピクセル幅であることが望ましい場合が非常に多くあります。ヒンティングはまた、ステムやオーバーシュートといった、小さなピクセルサイズで問題を引き起こしうる特徴も管理します。) |
ミスした画像(不正な切り抜きによる)
上記の例の最後の画像(例:「crop_miss.gif」)は、特殊な空の画像も生成しました。このような画像は、空または無意味な結果を生成する Crop、Trim、レイヤー比較、さらには GIF アニメーション最適化 などの操作によって生成されることがあります。たとえば前述の例では、「[-crop](https://imagemagick.org/command-line-options/#crop)」操作が切り抜こうとした実際の画像を外してしまったため、この特殊な「ミスした」画像と、いくつかの情報警告メッセージが生成されました……
出力画像、すなわち「ミスした」画像は、サイズが 1 ピクセル・オフセット 0 という最小限の画像ですが、元画像のページまたはキャンバスのサイズと、その画像に関連付けられたその他のメタデータを保持しています。これは、「[-crop](https://imagemagick.org/command-line-options/#crop)」が返すべきだった「空」または「サイズゼロ」の画像を表しますが、「ゼロ」次元の画像を出力できる画像形式が存在しないため、代わりに 1 個の透明ピクセルの画像が使われます。より分かりやすくするために、ここにミスした画像の「[identify](basics.html#identify)」出力と、その 1 ピクセル画像の「IM ピクセル列挙」を示します。これにより、その画像が透明な単一ピクセル 1 個しか含んでいないことが分かります。
magick identify crop_miss.gif
magick crop_miss.gif crop_miss_data.txt
この「ミスした」画像は、基本的には「[null:](files.html#null)」画像を作成するのと同じですが、元のソース画像のページまたは仮想キャンバスのサイズが設定されており(ただしオフセットは設定されません)、GIF アニメーションのタイミング遅延などその他のすべての画像メタデータも保持されます。ただし、切り抜き後もアニメーションが正しく保たれるよう、GIF の破棄方法(disposal method)は変更されることがあります。基本的に、「[-crop](https://imagemagick.org/command-line-options/#crop)」やそれに類する他のオペレーターが特殊な「ミスした」画像を生成しうることを念頭に置いておく必要があります。したがって、IM を使ったスクリプトを書く際は、このような最小限の画像が生じうるうえに問題を引き起こしうる場合、警告メッセージやこの特殊な「ミスした画像」を探すよう計画しておくべきです。警告メッセージが不要な場合(たとえば時折発生する「ミスした」画像を予期して処理する場合など)は、コマンドラインに「[-quiet](https://imagemagick.org/command-line-options/#quiet)」操作制御設定 を追加できます。これにより IM は、本当のエラーだけを出力し、情報警告メッセージを出力しないようになります。現時点では、現在の画像シーケンスから「ミスした」画像や「[null:](files.html#null)」画像を取り除く方法はありません。ただし、そのような方法は IM の将来のリリースに向けて提案されています。そうした方法が必要だと感じたら、私にメールしてください。
既存の仮想キャンバスを持つ画像の切り抜き
画像がすでに既存の 仮想キャンバス(たとえば GIF アニメーションのフレーム)を持っている場合、「[-crop](https://imagemagick.org/command-line-options/#crop)」操作は実際の画像ではなく仮想キャンバスを基準に適用されます。つまり、切り抜かれた画像の実際のピクセルデータのキャンバス上でのオフセットを保持しようとします。すなわち、切り抜き前の特定のピクセルは、切り抜き後も仮想キャンバスを基準にして同じオフセットに位置するはずです。このようにして、「キャンバス」自体は切り抜かれていなくても、レイヤー化された画像や GIF アニメーションの切り抜きが正しく機能し続けます。ここではページキャンバスの中央に配置した画像を作成し、さまざまな方法で切り抜きます。先ほどと同様、キャンバスのサイズ自体は操作によって変更されません。
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 の通常の警告メッセージを「[-quiet](https://imagemagick.org/command-line-options/#quiet)」設定で抑制しています。何が起きているかを正確に確認できるよう、画像の右下隅のページ切り抜きをもう少し詳しく見てみましょう。ここでは、切り抜かれた領域の上に半透明の四角形を描いてあります。
magick paged.gif -page 64x64+32+32 -size 32x32 xc:'#fff8' \
-alpha set -background none -mosaic crop_area_br.png
これを見れば、何が起きているのかが分かります。切り抜きはページキャンバス内に完全に収まっているにもかかわらず、実際の画像を完全には覆っていませんでした。その結果、実際の画像はユーザーが意図したよりも小さくなりますが、依然として、より大きなキャンバスまたはページ上に配置されています。
結果から仮想キャンバスを取り除く
この 仮想キャンバス 情報が不要な場合は、特殊な「[+repage](https://imagemagick.org/command-line-options/#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 の新規ユーザーが「[-crop](https://imagemagick.org/command-line-options/#crop)」オペレーターから通常期待する結果です。実際これは非常によく行うことなので、経験則と呼べるほどです。
「crop」のような操作の後には、常に「[+repage](https://imagemagick.org/command-line-options/#repage)」を使うこと。
その情報を実際に保持する必要がある場合を除いて。
上記の最後の画像は、もちろん特殊な 切り抜きミス画像 ですが、警告メッセージは「[-quiet](https://imagemagick.org/command-line-options/#quiet)」操作設定で抑制しました。 |
IM バージョン 5 以前では、「[+repage](https://imagemagick.org/command-line-options/#repage)」操作は「-page +0+0」引数列で扱われており、通常は GIF のように仮想キャンバスとオフセット情報を使う形式に保存する直前に使われていました。しかしそれは、画像をファイルに読み書きするときにしか使えず、複数の画像処理操作の間で使うことができませんでした。__IM バージョン 6 の コマンドライン再構成 により、「[-page](https://imagemagick.org/command-line-options/#page)」オプションは GIF アニメーション や 画像のレイヤー を作成するための、純粋な画像の読み込み/作成設定になりました。そのため、ユーザーが仮想キャンバス情報を設定・変更できるよう、別途「[-repage](https://imagemagick.org/command-line-options/#repage)」および「[-set](https://imagemagick.org/command-line-options/#set) page」オペレーターが追加されました。 |
|---|---|
仮想キャンバスを調整するビューポート切り抜き
ImageMagick バージョン 6.2.4-5 から、「[-crop](https://imagemagick.org/command-line-options/#crop)」引数に新しい特殊なフラグを追加できるようになりました。このフラグ '!' は、返される画像の 仮想キャンバス 情報が切り抜き領域を基準とするよう調整するよう 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
| '!' 文字は、「csh」のような一部の UNIX シェルでは特別な意味を持つため、引用符内に置いた場合でもバックスラッシュでエスケープする必要があります。
---|---
返された画像のキャンバスサイズが、画像を切り抜いた領域に一致するようになったことに注目してください。実際の画像内に完全に収まる画像の切り抜きでは、結果は切り抜きの後に「[+repage](https://imagemagick.org/command-line-options/#repage)」を続けたものと同等になります。しかし、画像の一部または全部を外した切り抜きでは、結果はより大きなキャンバスになり、結果の画像にオフセットが付く可能性があります。したがって、これは切り抜き後にページ/キャンバス情報をリセットするための「[+repage](https://imagemagick.org/command-line-options/#repage)」の代わりにはなりません。ただし、「ビューポート切り抜き」の後に Flatten を続けて、画像の新しい仮想キャンバスを実際のピクセルで「埋める」ことはできます。つまり、要求した切り抜きのサイズであることが保証され、「ミスした」領域は現在の「[-background](https://imagemagick.org/command-line-options/#background)」色の「ビューポート」で埋められた画像が得られます。たとえば 画像をパディングする 場合などです。 |
magick rose: -crop 100x100-15-25\! -background skyblue -flatten \
crop_viewport.gif
![[IM Output]](../static/img/crop/crop_viewport.gif)
ビューポート切り抜きの後に画像を flatten することは、実際には「パディング付き切り抜き」を提供するために Extent オペレーター(下記参照)を使うことと同等です。「ビューポート切り抜き」フラグは GIF アニメーションを切り抜く際にも非常に重要で、キャンバスサイズを調整するだけでなく、すべての画像フレームが切り抜き領域内で依然として正しく配置されることも保証します。このオプションがなければ、GIF アニメーションの切り抜きは非常に難しく、画像のキャンバスサイズとオフセットを外部で補正する必要があります。その例については アニメーションの切り抜き、キャンバスも含めて を参照してください。多くの点で「ビューポート切り抜き」は、特殊な Viewport Distort 設定 と密接に関連しています。どちらも結果の画像への「ウィンドウ」であるかのように振る舞うからです。どちらも「切り抜き」の手法として使えます。 | '!' フラグは、複数画像の タイル切り抜き を生成する場合や、等面積タイル切り抜きでは使えません。それらでは異なる意味を持ちます。下記の該当セクションを参照してください。
---|---
グラビティを基準にした切り抜き
「[-crop](https://imagemagick.org/command-line-options/#crop)」のオフセット位置は、既定では画像の左上隅を基準とします。しかし「[-gravity](https://imagemagick.org/command-line-options/#gravity)」設定を行うことで、画像の中央、隅、または端を基準に画像を切り取るよう「[-crop](https://imagemagick.org/command-line-options/#crop)」に指示できます。グラビティ切り抜きの最も一般的な用途は、画像の 'center'(中央)を切り抜くことです。 |
magick rose: -gravity Center -crop 32x32+0+0 +repage crop_center.gif
![[IM Output]](../static/img/crop/crop_center.gif)
「[-gravity](https://imagemagick.org/command-line-options/#gravity)」設定は、切り抜きの初期「ゼロ」位置に影響するだけでなく、切り抜きオフセットの方向にも影響します。たとえば「[-gravity](https://imagemagick.org/command-line-options/#gravity)」を 'South' にした場合、オフセット '+0+5' は、通常のように下方向ではなく、切り抜き領域を上方向にずらします。 |
magick rose: -gravity South -crop 20x20+0+5 crop_south.gif
![[IM Output]](../static/img/crop/crop_south.gif)
上記の切り抜き例の位置に注目してください。切り抜き領域が画像の下端からどのようにずれたかが分かるよう、わざと「[+repage](https://imagemagick.org/command-line-options/#repage)」操作を省略しました。また、切り抜き領域は下端(南)を基準にするだけでなく、その領域が下端の中央に「揃えられ」ていることにも注目してください。これはすべてのグラビティの影響を受ける操作で行われます。
画像のパーセンテージで切り抜く
「[-crop](https://imagemagick.org/command-line-options/#crop)」オペレーターは、画像を元のサイズに対する単なるパーセンテージで切り抜く方法も理解します。たとえば次は画像のサイズを半分にします。 |
magick rose: -crop 50%x+0+0 crop_half.gif
![[IM Output]](../static/img/crop/crop_half.gif)
| サイズの数値が 1 つだけ与えられた場合、その値が幅と高さの両方のパーセンテージとして使われ、切り抜かれる領域の最終サイズは最も近い整数に丸められます。オフセットは省略できません。
---|---
なお、サイズはパーセンテージにできますが、オフセットは常にピクセル単位です。画像サイズのパーセンテージとしてオフセットを指定することはできません。 |
magick rose: -crop 50%x+30+20 crop_percent.gif
![[IM Output]](../static/img/crop/crop_percent.gif)
| _切り抜きをオフセット付きで指定する場合は、引数が正しく解釈されるよう、引数に 'x' 記号を必ず指定する必要があります。これは、切り抜き領域の幅と高さの両方に単一の数値だけを指定する場合に特に重要です。
そのため、'50%+30+20' のような引数は使えず、これはエラーとなり、結果として crop は何もせず黙って終了します。_
---|---
より一般的には、パーセンテージ切り抜きは画像の中央から行われます。 |
magick rose: -gravity Center -crop 50x80%+0+0 crop_percent_center.gif
![[IM Output]](../static/img/crop/crop_percent_center.gif)
| パーセンテージ記号 '%' は引数のどこにでも置くことができ、指定された場合は幅と高さの両方の数値を指すようになります。これは、「画像サイズ」の部分が画像の仮想キャンバスまたはページサイズに対する割合(パーセンテージ)であることを宣言するフラグにすぎません。オフセットは常にピクセル単位で指定します。
---|---
パーセンテージ切り抜きでも「ビューポート切り抜き」フラグを使って、切り抜きのキャンバスサイズとオフセットを切り抜いた領域に自動的に設定できます。 |
magick rose: -gravity Center -crop 50%\! crop_percent_vp.gif
![[IM Output]](../static/img/crop/crop_percent_vp.gif)
| _タイル切り抜きにはパーセントサイズを使えません(次節参照)。そのため、オフセットが指定されず、パーセントサイズが指定された場合(上記のように)、オフセット +0+0 が仮定されます。
_
---|---
'!' フラグは、「[+repage](https://imagemagick.org/command-line-options/#repage)」が不要であることを意味します。ただし、仮想キャンバスサイズとオフセットを持つ入力画像については、依然として注意が推奨されます。
タイル切り抜き、1 枚の画像を複数の画像に細分する
crop の便利な側面の 1 つは、crop コマンドに具体的な位置を指定しない場合です。つまり、サイズだけを指定し、画像内で切り抜く位置を指定しません。この場合、crop は 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
| 画像から特定の枚数のタイルだけを抽出したい場合は、下記の おおむね等しいサイズの区画に切り抜く を参照してください。 | 「[+gravity](https://imagemagick.org/command-line-options/#gravity)」を使ってグラビティをオフにしておくのは良い考えです。これは、ある特殊なケース(中央寄せパーセンテージ切り抜き)では、グラビティ設定がタイル切り抜きをオフにしてしまうことがあるためです。タイル切り抜きに対するグラビティのその他の影響も未定義です。 |
|---|---|
「[-mosaic](https://imagemagick.org/command-line-options/#mosaic)」または「[-flatten](https://imagemagick.org/command-line-options/#flatten)」画像レイヤー操作(Layer Flatten を参照)を使えば、これらの画像をすべて互いの上に重ねて、元の画像を復元できます。 |
magick tiles_[0-3].gif -background white -mosaic tiles_mosaic.gif
![[IM Output]](../static/img/crop/tiles_mosaic.gif)
しかし見て分かるとおり、画像の仮想キャンバスは「[-mosaic](https://imagemagick.org/command-line-options/#mosaic)」によって背景色で埋められています。代替手段として「[-layers](https://imagemagick.org/command-line-options/#layers) merge」(Layer Merge を参照)を使うこともできます。これは、複数のレイヤー画像を、与えられたすべての画像をちょうど収められる大きさの新しいレイヤー画像にマージします。つまり、「[-mosaic](https://imagemagick.org/command-line-options/#mosaic)」や「[-flatten](https://imagemagick.org/command-line-options/#flatten)」のレイヤー手法のように仮想キャンバスが埋められることはありません。 |
magick tiles_[0-3].gif -background none -layers merge tiles_layered.gif
magick identify tiles_layered.gif
[![\[IM Text\]](../static/img/crop/tiles_layered_ident.txt.gif)](../static/img/crop/tiles_layered_ident.txt)
「[+repage](https://imagemagick.org/command-line-options/#repage)」を使ってキャンバスとオフセット情報をリセットしていた場合、画像にはもはや、切り抜かれた場所のオフセットも、元のソース画像のサイズも含まれていません。その場合は、「magick montage」の特殊な 'concatenation'(連結)モードを使って、すべての画像を再び結合できます。元の画像から何行または何列の画像が抽出されたかを 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 個の完全なタイル + 余り -
次に、余りの画像を保持するために、必要なら行と列を 2 つずつ追加します。
2x2 + 2x2 => 4x4 個のタイル画像 -
これにタイルサイズを掛けて、仮想キャンバスのサイズを得ます。
30x20 * 4x4 => 120x80 のキャンバスサイズ -
元の画像サイズを引き、それを 2 で割って中央寄せのオフセットを得ます。
( 120x80 - 70x46 ) / 2 => +25+17
したがって、仮想キャンバスと中央寄せオフセットは 120x80+25+17 です。そして、上記の計算を使って中央寄せタイル切り抜きを実行します……
magick rose: -repage 120x80+25+17 -crop 30x20 +repage rose_30x20_%02d.gif
タイルの元のオフセット位置を保持しつつ中央寄せオフセットを取り除きたい場合は、(上記の「[+repage](https://imagemagick.org/command-line-options/#repage)」を置き換えて)「-repage -25-17\!」を使って相対オフセット調整を行えます。タイル数に列と行を 2 つずつ追加せず、したがって負のオフセットを生成しない場合は、余りの端のタイルを実質的に無視し、画像内に存在する完全なタイルだけを出力できます。
magick rose: -repage 60x40-5-3 -crop 30x20 +repage rose_ctiles_%d.gif
基本的に、余りは計算された仮想キャンバスの「外側」にあるため、「[-crop](https://imagemagick.org/command-line-options/#crop)」オペレーターはそれらが存在することを知らず、無視します。ここでも、上記の「[+repage](https://imagemagick.org/command-line-options/#repage)」を、オフセット値を符号反転した「-repage +5+3\!」による相対オフセット調整に置き換えると、タイルが切り抜かれた元のオフセット位置が復元されます。中央寄せタイル切り抜きで余りを無視する別の方法は、仮想キャンバス設定を適切な切り抜きに置き換えるだけです。
magick rose: -gravity center -crop 60x40+0+0 +gravity +repage \
-crop 30x20 +repage rose_ctiles2_%d.gif
上記の方法はより理解しやすいですが、切り抜きを 2 回行うことになるため、少し遅くもなります。ただし、必要な計算は少なくて済みます。しかし、元のタイルオフセットを復元したい場合は、結局必要な相対オフセットを計算する必要があり、その場合は画像の仮想キャンバスを使う前述のより高速な方法でタスクを行ってもよいでしょう。
ストリップ切り抜き、行や列を切り出す
IM バージョン 6.1.1 で「[-crop](https://imagemagick.org/command-line-options/#crop)」が拡張され、サイズ引数の 1 つが欠けているか 0 に設定されている場合、欠けているサイズ引数が画像のキャンバス/ページのサイズに設定されるようになりました。ほとんどの場合、これは、関連するオフセットも 0 に設定されていれば、キャンバス上に配置された画像を覆うのに十分な大きさです。このちょっとした変更により、画像のサイズを覆うために '999999' のような巨大な数値を必要とせずに、画像から 1 行または 1 列を簡単に切り出せるようになりました。たとえば、ここでは「ページ化された」rose 画像から単純な行と列を抽出します。
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 Text\]](../static/img/crop/strip_ident.txt.gif)](../static/img/crop/strip_ident.txt)
両方のオフセットと、一方のサイズ引数を取り除けば、画像をタイルではなく、一連のストリップ(帯)または列に分割できます。
magick rose: -crop 40x30+10+10 crop.gif
magick crop.gif -quiet -crop 20x strips_%d.gif
magick identify crop.gif strips_?.gif
[![\[IM Text\]](../static/img/crop/strips_ident.txt.gif)](../static/img/crop/strips_ident.txt)
タイル切り抜きは、ストリップであれそうでなかれ、画像のページキャンバス全体にわたって行われ、したがってそのキャンバスに揃えられ、実際の画像にだけ揃えられるのではないことに注目してください。これが、上記の例で最初と最後に生成される実際の画像が 10 ピクセル幅しかない理由です。もちろん、特定のタイル、この場合は「列」が仮想キャンバス上の実際の画像を外した場合(上記の最後の画像のように)、切り抜きミス画像 が生成されます。IM が通常出すはずの警告は「[-quiet](https://imagemagick.org/command-line-options/#quiet)」設定で抑制されました。これは、スクリプトのようにそのような事態を予期し、それに備えている場合を除いて推奨されません。 | _画像が、自身のページや仮想キャンバス上にまったく現れないように配置されていたり、ページキャンバスが画像の小さなウィンドウや一部しか収められないほど画像が大きかったりすることもあり得ます。
そのような稀なケースでは、サイズ引数なしのストリップ切り抜きは画像の細分を誤り、それぞれ ミスした画像 や、仮想キャンバスの境界内の部分だけからなるより小さなタイルを生成します。
ただし「[-crop](https://imagemagick.org/command-line-options/#crop)」オペレーターは、これらの稀な特殊ケースを扱うようには修正されません。なぜなら、そうすると下記で示すような他のケースでの使用が妨げられるからです。
これが問題になる場合は、タイル画像を生成しようとする前に、「[+repage](https://imagemagick.org/command-line-options/#repage)」を使って仮想キャンバスを取り除き、切り抜き前に画像のページオフセットをサニタイズしてください。_
---|---
画像を別々の行に分割する別の方法として、特殊なスクリプト「[divide_vert](../static/img/scripts/divide_vert)」を参照してください。このプログラムは、単色の水平な「隙間」に従って画像を分割できます。たとえば、単純なテキストの画像を与えると、「行」と「隙間」が交互になった画像に分割します。簡単なオプションでそれらの隙間を取り除けます。
四分割、1 点を中心に切り分ける
crop のサイズ数値のいずれかが欠けている場合、それらは切り抜く画像の画像キャンバスのサイズに置き換えられます。これはほとんどの場合、その次元における画像全体が切り抜き結果の一部になる結果をもたらします。これにより、引数を慎重に使えば、画像を特定の点を中心に四分割する(その特定のピクセルが左下象限画像の右上ピクセルとして配置される)ことが可能になります。これを行うのに画像の大きさを知る必要はありません。たとえば、ここでは点 30,40 を中心に画像を四分割します。
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
もちろん、中心に切り分ける点が実際の画像を外した場合、結果の象限画像のうち 2 つ、あるいは 3 つまでが特殊な 切り抜きミスエラー 画像になります。
負のオフセットを使う、下端や左端を取り除く
「[-crop](https://imagemagick.org/command-line-options/#crop)」で負のオフセットを使えない理由はありません。実際、時にはそれが非常に明確な利点をもたらすことがあります。たとえば、ページ化された rose 画像を取り上げ、徐々に大きな負のオフセットで切り抜いてみましょう。「[-crop](https://imagemagick.org/command-line-options/#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
見て分かるとおり、オフセットをより大きな負の値へと徐々に小さくしていくと、下端と右端が少しずつ「切り落とされ」、最後の例ではほとんど実際の画像を外してしまいます。これをもう一歩進めると ミスした画像 が生成されます。これは「[-gravity](https://imagemagick.org/command-line-options/#gravity)」設定なしで「[-chop](https://imagemagick.org/command-line-options/#chop)」オペレーターを使うのに少し似ています。Chop、端を取り除く を参照してください。もちろん「[-crop](https://imagemagick.org/command-line-options/#crop)」を使う場合、キャンバス/ページ情報を調整するために「[+repage](https://imagemagick.org/command-line-options/#repage)」オペレーターを使う必要があるかもしれませんが、「[-chop](https://imagemagick.org/command-line-options/#chop)」はそのような調整を自動的に行います。仕方のないことです。
おおむね等しいサイズの区画に切り抜く
タイル切り抜き の最大の問題は、各タイルの最終サイズしか定義できないことです。これは、画像サイズが希望するタイルサイズのちょうど倍数であるときはうまく機能しますが、見てきたとおり、そうでない場合は右端と下端に「短い」タイルが残ってしまうことがあります。たとえば、もう一度組み込みの rose 画像を分割してみましょう。ただし、3x3 のタイルに分割しようとします。元の画像は 70x46 ピクセルなので、3 で割ると各タイルは 23x15 ピクセルになります……
magick rose: -crop 23x15 +repage +adjoin rose_23x15_%02d.gif
見て分かるとおり、これはうまくいきませんでした。rose 画像は、等しいサイズの 3 つのタイルにちょうど分割できないからです。この場合、1 ピクセル「短い」タイルが生じます。タイルのサイズを 24x16 ピクセルに拡大しても、やはり他のタイルより 2 ピクセル「短い」タイルが生じます。この状況は、欲しいタイルの数が大きくなるほど悪化します。たとえば、長さ 100 を 30 個のタイルに細分してみてください。不可能です。長さ 3 を使って 34 個のタイルを得るか、長さ 4 を使って 25 個のタイルを得るかのどちらかです。ちょうど 30 個の等しいサイズのタイルを得ることは不可能です! IM v6.5.8-9 以降では、「[-crop](https://imagemagick.org/command-line-options/#crop)」引数に特殊な '@' フラグを追加できるようになりました。このフラグは、画像を与えられた タイルの数 に可能な限り等しく分割しようと試みるよう「[-crop](https://imagemagick.org/command-line-options/#crop)」オペレーターに指示します。たとえば……
magick rose: -crop 3x3@ +repage +adjoin rose_3x3@_%d.gif
結果として、画像はわずかに異なるサイズを持つタイルに分割されました。しかし、タイルのサイズの違いはせいぜい 1 ピクセルです! 確認してみてください。おまけに、各タイルが隣のタイルと「重なる」ように画像を細分することもできます。これは、'@' フラグを使うだけでなく、欲しい重なりのピクセル数も指定することで行います。たとえば、rose を 20 ピクセルの重なり付きで四分割してみましょう。
magick rose: -crop 2x2+20+20@ +repage +adjoin rose_2x2+20+20@_%d.gif
ここでもすべての断片はサイズの違いがせいぜい 1 ピクセルです! ただしこの場合、rose は 2 で等しく割れるため、結果の画像は同じサイズになります。しかし、重なりや画像のサイズが奇数だった場合はそうなりません。その場合、より大きな要素が上端と左端に沿って配置されます。一方、3 つのタイルの場合、より大きい(または小さい)要素は中央に配置されます! さらに、負の重なりを使って、タイル間でちょうどそのピクセル数だけ「スキップ」することもできます! オペレーターをどう適用すべきかは、どのピクセルを「重ねる」か「スキップ」したいかによって正確に決まります。そしてそれは、画像の「端」の特性によります(下記の 間隔を空けて並べたタイル画像を分離する を参照)。「[-crop](https://imagemagick.org/command-line-options/#crop)」オペレーターのどんな使用でもそうですが、「ページ」オフセットが不要な場合は「[+repage](https://imagemagick.org/command-line-options/#repage)」を使って取り除くことが推奨されます。しかし、切り抜かれた画像のオフセット情報は非常に役立つことがあり、だからこそ保持されています。たとえば、それを使って出力ファイルに名前を付けたり、IM が計算したタイルのサイズや位置を調べたりできます。なお、等しいサイズのタイル切り抜きは、画像のどの部分が切り抜かれるかを判断する際に「[-crop](https://imagemagick.org/command-line-options/#crop)」オペレーターが画像の実際の仮想キャンバスを無視する唯一の状況です。つまり、タイル切り抜きの計算は仮想キャンバスサイズではなく実際の画像サイズに基づきます。それでも、最終的なタイルオフセットは依然として元の仮想キャンバスを基準にします。この crop オプションは、「ページ化された」画像に対する Shave オペレーター の代替としても使えます。 |
IM バージョン v6.6.1-0 より前では、仮想キャンバスオフセットを持つ画像の等しいサイズのタイル切り抜きは壊れていました。 |
|---|---|
間隔を空けて並べたタイル画像を分離する
固定サイズのタイルが固定量の空間で区切られている画像を持つことがよくあります。新しい '@' フラグ crop オペレーターを使えば、周囲の空間を含めるかスキップするかを選んで、それらのタイルをより簡単に切り出せます。ただし主な問題は、「タイル」画像の周囲には固定量の空間があるのに対し、端の周囲の空間の量は通常それほど固定されていないことです。これにより、「間隔を空けた」画像群には基本的に 3 種類の端の特性が生じ、それぞれを少しずつ異なる方法で扱う必要があります。 Montage されたタイル ここでは元の画像は、結合される前に単純に固定サイズの縁を与えられただけです。その結果、タイル間のピクセル間隔は常に偶数になります。さらに重要なことに、「端の間隔」はタイル間に置かれた間隔のちょうど半分です。これは実際、「[montage](montage.html)」がタイルの「セル」に間隔を空ける方法であり、下に示す例の画像はこのコマンドを使って生成されました。画像は単純にタイル状に結合されただけなので、(タイルサイズが分かっていれば)通常の タイル切り抜き を使うか、(タイルの数が分かっていれば)等しいサイズの切り抜き を使って、サブ画像と周囲の縁を分離できます。タイル間には基本的に重なりがなく、その後、単純な Shave オペレーター を使って、結果のタイルからその縁を取り除けます。
magick montage.gif -crop 5x1@ +repage +adjoin montage_%d.gif
magick montage_?.gif -shave 3x3 montage-3_%d.gif
端の周囲も同じ間隔 ここでは、サブ画像は 6 ピクセルで「間隔を空けて」並べられているだけでなく、端の周囲にも 6 ピクセルの間隔があり、かなりきちんと整って見えます。これは、既定の 等しいサイズの切り抜き を適切な量のピクセル「重なり」とともに使うことで扱われます。たとえば……
magick edged.gif -crop 5x1+6+6@ +repage +adjoin edged+6_%d.gif
オペレーターが画像を、同じサイズを保ちつつ 6 ピクセルの重なりを持つように分離した様子に注目してください。これはまさにそれが設計された目的です。負のオフセットを使うことで、重なる領域(間隔の部分)を最終結果に含めないよう IM に伝えます。
magick edged.gif -crop 5x1-6-6@ +repage +adjoin edged-6_%d.gif
さらに進めてもっと多くのピクセルを引けば、上記の数字から白い縁の一部を取り除くこともできます。
magick edged.gif -crop 5x1-8-8@ +repage +adjoin edged-8_%d.gif
1 タイルの切り抜きを指定するだけで、これを Shave オペレーター の代替手段として使うこともできます……
magick edged+6_0.gif -crop 1x1-6-6@ +repage tile-shave.gif
単純に間隔を空けたタイル 最も単純な間隔を空けたタイル画像は、端の間隔がないか、その端の間隔が画像から Trim されたものです。ただし、これを扱うには、'@' と '!' の両方のフラグを含めることで、この特殊な状況を IM に伝える必要があります。
magick spaced.gif -crop 5x1+6+6@\! +repage +adjoin spaced+6_%d.gif
この細分の端にある画像が、中央の画像より少し短いことに注目してください。これが、この特殊な「モード」の操作が、前述の間隔を空けたタイルの分類より実際には単純であるにもかかわらず、既定ではない理由です。また、'@' と '!' の両方のフラグを使う場合、1 タイルの切り抜き(この場合は垂直方向)は効果を持たないことにも注目してください。タイルの上端と下端の両方が「端」であり、したがって取り除くべき「端の間隔」がないからです。ここでも、重なりに負の値を使うことで、タイル切り抜きの結果に重なる(間隔の)領域を含めないよう IM に伝えられます。
magick spaced.gif -crop 5x1-6-6@\! +repage +adjoin spaced-6_%d.gif
| '!' 文字は、「csh」のような一部の UNIX シェルでは特別な意味を持つため、引用符内に置いた場合でもバックスラッシュでエスケープする必要があります。
---|---
これらの公式があれば、画像が重なっていたり間隔を空けて並べられていたりしても、グリッドを形成するタイル画像を切り抜けるようになるはずです。あなたが抱える具体的な問題が上記のケースのいずれかにぴったり当てはまらなくても、画像が上記の間隔を空けた画像のいずれかのカテゴリに当てはまるように、端のピクセルを適切に追加または削除できるはずです。
画像の縁の追加・削除
Border、画像の周囲に空間を加える
画像の端の周囲に少しだけ作業用の空間を加えたいだけで、そのために画像のサイズを知る必要があったり、それに依存したりしたくない場合がよくあります。直接的な空間の追加以外にも、画像に余分な空間を加える方法は多数あり、空白の画像やラベルを連結する、'Src' オーバーレイを合成する、または単に 画像をより大きなキャンバスに配置する などがあります。しかし、これらの方法は通常、扱っている画像の実際の大きさについて少なくとも何らかの見当が必要です。最も単純な画像空間追加の 1 つが「[-border](https://imagemagick.org/command-line-options/#border)」操作です。追加される空間の色は「[-bordercolor](https://imagemagick.org/command-line-options/#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
上記の最後の例の画像に注目してください。縁の色は透明色「none」に設定されていますが、これを期待どおりに機能させるには、画像が実際に「マット」または「アルファ」チャンネルを含んでいることを保証する必要がありました。また、垂直方向と水平方向の縁のサイズが同じ場合は、縁の 2 番目の数値を省略し、単一の数値だけを使えることにも注目してください。 |
上記のとおり、「[-border](https://imagemagick.org/command-line-options/#border)」オペレーターが使う既定の色は明るいグレーです。これは WWW 上のウェブページの既定のグレーのページ色とうまく一致するためです。 |
|---|---|
| 縁を画像サイズのパーセンテージとして指定できます。 |
magick rose: -border 10%x10% border_percent.jpg
![[IM Output]](../static/img/crop/border_percent.jpg)
内部で実際に起きているのは、「[-border](https://imagemagick.org/command-line-options/#border)」が適切なサイズの新しい画像を作成し、その新しい背景の上に元のソース画像を重ねることです。これ自体が ImageMagick における非常に便利な操作で、透明および半透明の画像の背景を設定するのに役立ちます。つまり、一見無意味に思える「-border 0」操作は、IM バージョン 6 では非常に便利な操作です。たとえば……
magick star.gif -bordercolor LimeGreen -border 0 star_background.gif
| もちろん、アルファ透明度を取り除く 方法は他にもたくさんあります。 | 透明度を持つ画像に縁を追加すると、既定で画像の透明な背景も埋められるという事実は、IM ユーザーと開発チームの間でいくらか議論を呼んできました。この議論の要約は Border、Frame、および BorderColor の使用 に記載されています。 |
|---|---|
Border とアルファ合成
bordercolor キャンバスへの画像のオーバーレイは「[-compose](https://imagemagick.org/command-line-options/#compose)」設定によって制御され、既定では '[Over](compose.html#over)' アルファ合成に設定されています。他の設定にすると、「[-border](https://imagemagick.org/command-line-options/#border)」操作は予期しない結果を生むことがあります。たとえば、いくつかの透明な領域を含む画像に適用したときの、「[-border](https://imagemagick.org/command-line-options/#border)」画像オペレーターと「[-compose](https://imagemagick.org/command-line-options/#compose)」のより興味深い使用例をいくつか示します。
magick star.gif -bordercolor LimeGreen \
-compose {_operation_} -border 5 {_result_}
'Over' と 'Copy' のどちらを使うかは、基本的に画像内の透明度を保持したいかどうかを決めます。たとえば、これは透明度を持つ同じ「star」画像ですが、今回は画像の透明度を壊さずに縁が追加されました。 |
magick star.gif -bordercolor LimeGreen -compose Copy \
-border 5 star_border_copy.gif
![[IM Output]](../static/img/crop/star_border_copy.gif)
'[Src](compose.html#src)' 合成は、現在の「[-bordercolor](https://imagemagick.org/command-line-options/#bordercolor)」設定に関わらず、(アルファチャンネルを持つ場合)画像に透明な縁を追加します。基本的に、「[-border](https://imagemagick.org/command-line-options/#border)」が生成した背景キャンバスは無視されます。'[Dst](compose.html#dst)' はあまり役に立たないように思えるかもしれませんが、元の画像と同じサイズ(または少し大きい)のキャンバスを生成するために使えます。元の画像はキャンバスの最終サイズを決めるためにのみ使われます。詳しい例については 既存の画像に合わせたサイズのキャンバス を参照してください。さまざまな「[-compose](https://imagemagick.org/command-line-options/#compose)」メソッドの詳細については アルファ合成の例 を参照してください。
Border と仮想キャンバス
「[-border](https://imagemagick.org/command-line-options/#border)」が仮想キャンバスを含む画像に適用される場合、それは依然としてその仮想キャンバス上の実際の画像の周囲に縁を追加し、キャンバス全体の周囲ではありません。
magick rose: -shave 12x0 -repage 64x64+9+9 paged.gif
magick paged.gif -border 5x5 paged_border.gif
追加された縁を収容するために、仮想キャンバスのサイズも縁の太さの 2 倍だけ増加したことに注目してください。これはもちろん、アニメーションの個々のサブフレームを実際に識別したい場合を除き、典型的な GIF アニメーションに直接 Border を追加することはできないことを意味します(たとえば、これをオーバーレイ画像を「フレーム化」するオプションとして使うスクリプト アニメーションフレームの Montage を参照)。縁を追加したい場合は、まずアニメーションを Coalesce して、持っているかもしれない フレーム最適化 を取り除くべきです。
Frame、3D 風の縁を加える
「[-frame](https://imagemagick.org/command-line-options/#frame)」オペレーターは「[-border](https://imagemagick.org/command-line-options/#border)」に非常によく似ており、下記で生成される最初の例の画像を見れば、「[-bordercolor](https://imagemagick.org/command-line-options/#bordercolor)」ではなく「[-mattecolor](https://imagemagick.org/command-line-options/#mattecolor)」を使った点を除いて、まったく同じ結果を生むことが分かります。なお、フレーム化された画像の生成では依然として「[-bordercolor](https://imagemagick.org/command-line-options/#bordercolor)」が使われます。下記参照。「[-frame](https://imagemagick.org/command-line-options/#frame)」を正しく使うには、コマンドに引数を 2 つだけでなく 4 つ与える必要があります。追加の引数は、生成されるフレームの「外側」と「内側」のベベルの幅を指定します。ここに「[-frame](https://imagemagick.org/command-line-options/#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
複数のフレーム操作を使うと、さらに奇妙なフレーム化スタイルを生み出すこともできます。
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
| 既定の「[-mattecolor](https://imagemagick.org/command-line-options/#mattecolor)」は、「[-bordercolor](https://imagemagick.org/command-line-options/#bordercolor)」の既定設定よりわずかに暗いグレーです。これによって、WWW 上のウェブページの既定のグレー色(「mosaic」や「netscape」のような初期のブラウザが使用)にも一致します。(下記参照)
---|---
| 「[-frame](https://imagemagick.org/command-line-options/#frame)」は実際には「[-mattecolor](https://imagemagick.org/command-line-options/#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]](../static/img/crop/frame_montage.gif)
フレーム「[-frame](https://imagemagick.org/command-line-options/#frame)」に半透明の「[-mattecolor](https://imagemagick.org/command-line-options/#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]](../static/img/crop/frame_plasma.gif)
あるいは、フレームを別々に着色し(特殊な 'Dst' 合成設定を使って生成)、着色したフレームに後から画像を重ねることもできます。しかしこれは実に非常にトリッキーになっていきます。フレームを使うより高度な技法については フレーム化の技法 を参照してください。
Frame とアルファ合成
Frame は「[-border](https://imagemagick.org/command-line-options/#border)」オペレーターと密接に関連しています。フレームは「[-mattecolor](https://imagemagick.org/command-line-options/#mattecolor)」を使って描かれるだけでなく、このオペレーターは、フレームが最初に描かれる背景を定義するために「[-bordercolor](https://imagemagick.org/command-line-options/#bordercolor)」設定も利用します。さて、透明度を持たない画像では、「[-bordercolor](https://imagemagick.org/command-line-options/#bordercolor)」は画像自体に重ねられるため見えません。しかし、いくつかの透明な領域を含む画像では、背景色が見えるようになります。 |
magick star.gif -frame 6x6+2+2 star_framed.gif
![[IM Output]](../static/img/crop/star_framed.gif)
言い換えると、「[-frame](https://imagemagick.org/command-line-options/#frame)」は、画像を取り上げて、単色の背景を持つ額縁の上に重ねるかのように振る舞います。そのため、画像のうち透明な部分はすべて「[-bordercolor](https://imagemagick.org/command-line-options/#bordercolor)」(既定では明るいグレー色)に置き換えられます。 | 透明度を持つ画像にフレームを追加すると、既定で画像の透明な背景も bordercolor で埋められるという事実は、IM ユーザーと開発チームの間でいくらか議論を呼んできました。この議論の要約は Border、Frame、および BorderColor の使用 に記載されています。
---|---
画像をフレーム化しつつその透明度を保持したい場合は、2 つの解決策があります。1 つ目は、'none' のような透明な「[-bordercolor](https://imagemagick.org/command-line-options/#bordercolor)」を使うことです。 |
magick star.gif -bordercolor none -frame 6x6+2+2 star_framed_none.gif
![[IM Output]](../static/img/crop/star_framed_none.gif)
もう 1 つの解決策、そして推奨される方法は、画像がフレームに追加される際に透明なピクセルが保持されるようにすることです。これは、'[Copy](compose.html#copy)' という特殊な「[-compose](https://imagemagick.org/command-line-options/#compose)」メソッドを使うことで行います。 |
magick star.gif -compose Copy -frame 6x6+2+2 star_framed_copy.gif
![[IM Output]](../static/img/crop/star_framed_copy.gif)
| 「[-border](https://imagemagick.org/command-line-options/#border)」と「[-frame](https://imagemagick.org/command-line-options/#frame)」の両方の背景画像として「-bordercolor」を使う仕組みは、IM のバージョン 6.1.4 で追加されました。それ以前は、生成される背景キャンバスは黒いキャンバスで構成され、その上に縁やフレームが描かれていました。
この黒の使用は、内部処理で内部の「[-frame](https://imagemagick.org/command-line-options/#frame)」関数を多用する「magick montage」コマンドにとって特に問題でした。(Montage の背景と透明度の扱い を参照)
---|---
見て分かるとおり、「[-frame](https://imagemagick.org/command-line-options/#frame)」オペレーターも、「[-border](https://imagemagick.org/command-line-options/#border)」と同様に、ソース画像が背景フレームにどのように重ねられるかを定義するために「[-compose](https://imagemagick.org/command-line-options/#compose)」設定を使います。
magick star.gif -bordercolor LimeGreen \
-compose {_operation_} -frame 6x6+2+2 {_result_}
'[Copy](compose.html#copy)' という「[-compose](https://imagemagick.org/command-line-options/#compose)」設定の使用は、「magick montage」のフレームで「[-bordercolor](https://imagemagick.org/command-line-options/#bordercolor)」設定も使いたい場合に非常に重要になります。詳細は Montage の背景と透明度の扱い を参照してください。
Frame と仮想キャンバス
Border と仮想キャンバス と同様に、frame もその仮想キャンバス上の実際の画像の周囲に適用され、キャンバス全体の周囲ではありません。
magick rose: -shave 12x0 -repage 64x64+9+9 paged.gif
magick paged.gif -frame 5x5+2+2 paged_framed.gif
追加されたフレームを収容するために、仮想キャンバスのサイズも縁の太さの 2 倍だけ増加したことに注目してください。これはもちろん、アニメーションの個々のサブフレームを実際に識別したい場合を除き、典型的な GIF アニメーションに直接 Frame を追加することはできないことを意味します(たとえば アニメーションフレームの Montage を参照)。縁を追加したい場合は、まずアニメーションを Coalesce して、持っているかもしれない フレーム最適化 を取り除くべきです。
Shave、画像から端を取り除く
「[-border](https://imagemagick.org/command-line-options/#border)」や「[-frame](https://imagemagick.org/command-line-options/#frame)」オペレーターの逆が「[-shave](https://imagemagick.org/command-line-options/#shave)」で、同じ引数を与えると、これらのコマンドが追加した空間を取り除きます。
magick border.gif -shave 10x10 shave.gif
magick border.gif -shave 10x0 shave_sides.gif
magick border.gif -shave 0x20 shave_topbot.gif
これら 3 つのオペレーターについて念頭に置くべき主な点は、片側だけや隣接する側ではなく、画像の 反対側 に空間を追加・削除するということです。画像の片端だけを取り除きたい場合は、代わりに「[-chop](https://imagemagick.org/command-line-options/#chop)」オペレーターを使う必要があります。(下記の Chop の例 を参照)。先ほどと同様に、「[-border](https://imagemagick.org/command-line-options/#border)」、「[-frame](https://imagemagick.org/command-line-options/#frame)」、「[-shave](https://imagemagick.org/command-line-options/#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
shave を使う代わりに、新しい 等しいサイズのタイル切り抜き オペレーターを使うこともできます。このオペレーターの利点は、「[-shave](https://imagemagick.org/command-line-options/#shave)」とは違って、結果の画像のキャンバスサイズを変更しないことです。
magick paged_frame.gif -crop 1x1-10-10@ paged_tile_shave.gif
| IM バージョン v6.6.1-0 より前では、キャンバスオフセットを持つ画像(上記のような)の等しいサイズのタイル切り抜きは壊れていました。
---|---
Extent、画像サイズを直接調整する
いくつかの議論を経て、画像サイズの最終サイズを直接調整するオペレーターが IM バージョン 6.2.4 で追加されました。「[-extent](https://imagemagick.org/command-line-options/#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
見て分かるとおり、画像に追加された新しい領域はすべて「[-background](https://imagemagick.org/command-line-options/#background)」色で埋められます。 |
IM バージョン v6.3.2 より前は、「[-extent](https://imagemagick.org/command-line-options/#extent)」は新しい領域のメモリを単にゼロ、つまり真っ黒にクリアするだけでした。領域を「[-background](https://imagemagick.org/command-line-options/#background)」色で埋めることはありませんでした。 |
|---|---|
また IM v6.3.2 以降、「[-extent](https://imagemagick.org/command-line-options/#extent)」は「[-gravity](https://imagemagick.org/command-line-options/#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
上記の最後の例は、extent が「[-repage](https://imagemagick.org/command-line-options/#repage)」を必要とせずに中央寄せの切り抜きも行えることを示しています。ただし、現在の「[-background](https://imagemagick.org/command-line-options/#background)」色で画像を「flatten」します。オフセットを使うこともでき、これは基本的に Extent オペレーター が、位置に関わらず、背景でパディング埋めされる単純な Crop にすぎないことを意味します。 |
magick rose: -background skyblue -extent 100x100-15-25 extent.png
![[IM Output]](../static/img/crop/extent.png)
グラビティに従って画像を切り抜くことも拡張することもできるこの能力により、このオペレーターは、画像が特定のサイズの領域に収まるようパディングまたは切り抜くのに最適です。たとえば サムネイルをパディング/埋めて収める を参照してください。 なお、「[-extent](https://imagemagick.org/command-line-options/#extent)」は、Border と Frame の両オペレーターが使うのと同じ「オーバーレイ」技法を使って動作します。そのため、既定では、透明度を含む画像に対してこれを使うと、透明度が現在の「[-background](https://imagemagick.org/command-line-options/#background)」色に置き換えられます。 |
magick star.gif -background LimeGreen -extent 80x80-10-10 star_extent.gif
![[IM Output]](../static/img/crop/star_extent.gif)
ここでもこの解決策は、適切な「[-compose](https://imagemagick.org/command-line-options/#compose)」メソッドを設定するか、「[-background](https://imagemagick.org/command-line-options/#background)」色を 'None' に設定するかのどちらかです。
行・列・端の追加と削除
Splice、行・列・端を加える
「[-splice](https://imagemagick.org/command-line-options/#splice)」オペレーターは IM バージョン 6 の新機能です。Splice、新しい画像オペレーターの作成例 を参照してください。これは基本的に、画像の中央または片端に行や列の空間を追加するという、まさに必要とされていた機能を提供します。挿入される空間の色は「[-background](https://imagemagick.org/command-line-options/#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 は画像自体からこの値を判断しようとします。これは、画像によっては白(通常の既定値)になることもあれば、黒になることもあり、GIF 形式の場合はその画像が保存されたときに設定されていた背景色が何であれそれになる可能性があることを意味します。 つまり基本的には、「[-background](https://imagemagick.org/command-line-options/#background)」色を設定しない場合、その既定値は画像によって異なり、ほとんど何でもありうるということです。 背景を使うオペレーターを使う前には、常に「[-background](https://imagemagick.org/command-line-options/#background)」を設定してください。
---|---
さて、画像に行や列を追加するのは良いことですが、「[-splice](https://imagemagick.org/command-line-options/#splice)」オペレーターは画像の片端だけに空間を追加するのに理想的です。どの端かは、「[-gravity](https://imagemagick.org/command-line-options/#gravity)」オプションと splice のジオメトリ設定を使って決まります。
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
splice の最も一般的な用途の 1 つは、ラベルを描くための空間を追加することです。(画像へのラベル付け を参照) |
magick rose: -gravity South -background LimeGreen -splice 0x15 \
-annotate 0x0 'Rose' splice_label.gif
Chop、行・列・端を取り除く
「[-splice](https://imagemagick.org/command-line-options/#splice)」の自然な逆が、はるかに古い「[-chop](https://imagemagick.org/command-line-options/#chop)」オペレーターです。「[-splice](https://imagemagick.org/command-line-options/#splice)」と同じ引数、同じ「[-gravity](https://imagemagick.org/command-line-options/#gravity)」設定を与えると、「[-chop](https://imagemagick.org/command-line-options/#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
最後の例の処理を続けて、「[-splice](https://imagemagick.org/command-line-options/#splice)」と「[-chop](https://imagemagick.org/command-line-options/#chop)」の順序を逆にすることで、描画やオーバーレイを使わずに画像の中央から行や列(あるいは両方)を「クリア」する方法を示しました。chop はより一般的には、グラビティを使ってその端を選択し、画像から 1 つの端を切り落とすのに使われます。たとえば……
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
単一の端を取り除くために「[-chop](https://imagemagick.org/command-line-options/#chop)」を使う代わりに、実際にはより汎用的な「[-crop](https://imagemagick.org/command-line-options/#crop)」オペレーターを使うこともできます。これは、下端や右端を得るために「[-gravity](https://imagemagick.org/command-line-options/#gravity)」を使う必要はありませんが、その後で画像のキャンバスを「[+repage](https://imagemagick.org/command-line-options/#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
これは、「[-crop](https://imagemagick.org/command-line-options/#crop)」に取り除く画像領域が与えられない場合、画像のキャンバス(実際の画像ではなく画像の仮想キャンバス)のサイズが既定値になるという事実に依存しています。これは、(単純な画像では)切り取る切り抜き領域をオフセットするだけで画像の端を取り除けることを意味します。「[-crop](https://imagemagick.org/command-line-options/#crop)」を使って画像の端を「chop」するこの方法は、Don Sheythe によって発見・公開され、いくらかの議論を経て IM の「機能」とみなされたため、ここに含めています。
高度な切り抜き技法
指定したアスペクト比に切り抜く
特定のアスペクト比に合わせて画像を切り抜けますが、これはトリッキーで、いくらか自前の数学的技法を使います。たとえば、計算を行うスクリプトを書いてから Crop を行えます。あるいは IM v6 では、No-Op 歪み の最中に Distort Viewport で計算を行い、画像の希望する部分を抽出できます。これは 中央寄せ正方形切り抜き で説明されています。しかし ImageMagick バージョン 7 では、「[-crop](https://imagemagick.org/command-line-options/#crop)」や「[-extent](https://imagemagick.org/command-line-options/#extent)」のようなコマンドで直接数学的計算を行えるようになり、「[-distort](https://imagemagick.org/command-line-options/#distort)」を誤用する必要がなくなりました。これは IM 開発者フォーラムの アスペクト比への切り抜き で詳しく議論されています。
Trim、'自動切り抜き' オペレーター
「[-trim](https://imagemagick.org/command-line-options/#trim)」オペレーターは、上記 で議論した非常に多用途な「[-crop](https://imagemagick.org/command-line-options/#crop)」オペレーターのごく近い親戚です。ただし、引数を与える代わりに、このオペレーターは色や透明度が変化しない画像の縁や端を取り除こうと試みます。言い換えると、画像を取り囲む「つまらない」部分を取り除きます。 |
なお、ImageMagick バージョン 5 以前では、自動切り抜き操作は「[-crop](https://imagemagick.org/command-line-options/#crop)」オペレーターに '0x0' 引数を使うことで実現されていました。これはもはや当てはまりません。crop における「ゼロ」サイズ引数は今や「無限」または「画像サイズの限界まで」を意味するようになったからです。 そのため、crop への '0x0' 引数は今や事実上、元の画像キャンバスのサイズのタイルに画像を切り抜くことを意味します。言い換えると、IM v6 では、結果は元の画像と同じ、つまり「何もしない(no-op)」になります。 |
|---|---|
| たとえば、ここでは IM ロゴを取り上げ、リサイズし、ロゴ内の周囲の余分な空間をすべて「trim」つまり「自動切り抜き」します。 |
magick logo: -resize 30% -trim trim.gif
上記から 2 つのことに注目すべきです。1 つ目は、「[-crop](https://imagemagick.org/command-line-options/#crop)」と同様に、「[-trim](https://imagemagick.org/command-line-options/#trim)」が画像のキャンバスサイズを保持することです。これは、trim の数値引数を抽出して、さらなる処理や画像処理の調整に使えることを意味します(これを行う例については 「ノイズの多い」画像を Trim する を参照)。 ![[IM Output]](../static/img/crop/trim.gif)
ここでは画像を trim しますが、実際に trim された画像ではなく、画像のどの部分が trim されたかという結果だけをリストアップします。
magick logo: -resize 30% -trim info:-
しかし、この情報が不要な場合は、「[+repage](https://imagemagick.org/command-line-options/#repage)」オペレーターを使うか、キャンバス情報を保存しない形式(JPEG 形式など)に保存するかして、画像のページ情報をリセットして捨てるだけです。ここではキャンバス情報を捨てていることを明確にするため、その両方を行います。 |
magick logo: -resize 30% -trim +repage trim_repage.jpg
![[IM Output]](../static/img/crop/trim_repage.jpg)
注目すべき 2 つ目の点は、trim が実際には最終的な画像のすぐ端まで trim しなかったことです。これはロゴ画像の右下隅で特に顕著で、足とその影、そして trim された端との間に明らかな隙間が見えます。この隅では、色が画像の背景色と数値的に異なるものになっていました。そのため、画像に実際の変化が見えなくても、「[-trim](https://imagemagick.org/command-line-options/#trim)」オペレーターはわずかな色の変化を検出するので、期待したほど画像の近くまで trim しませんでした。画像がすべて 1 色の場合、「[-trim](https://imagemagick.org/command-line-options/#trim)」は画像を最小限の透明な単一ピクセルの ミスした画像 まで trim します。これは論理的で、画像をそのまま残した場合により深刻な問題が起きるのを防ぎます。
特定の色で Trim する
「[-trim](https://imagemagick.org/command-line-options/#trim)」の最も厄介な問題の 1 つは、特に自動画像処理スクリプトにおいて、trim が少し予測しにくいことです。たとえば、特定の 1 色や、あるいは 1 色だけに自身を制限することはありません。そのため、簡単に予想以上に多くを trim してしまうことがあります。たとえば、縞模様の色の単純な画像を単純に trim してみましょう。
magick -size 32x32 xc:red xc:green xc:blue +append stripes.gif
magick stripes.gif -trim +repage stripes_trimmed.gif
見て分かるとおり、「[-trim](https://imagemagick.org/command-line-options/#trim)」は 1 色だけでなく 2 色を trim してしまいました! 自動スクリプトでは、これは非常にまずく、予期しない結果を生むことがあります。画像から trim したい色が分かっている場合、より良い方法は、その色の幅 1 ピクセルの小さな「[-border](https://imagemagick.org/command-line-options/#border)」を画像に追加することです。この場合は 'red' を取り上げましょう。
magick stripes.gif -bordercolor red -border 1x1 \
-trim +repage stripes_trim_red.gif
magick stripes.gif -bordercolor red -border 1x1 -trim \
stripes_trim_red_shifted.gif
![[IM Output]](../static/img/crop/stripes_trim_red_shifted.gif)
そこで、特定の色を trim する際に、仮想キャンバスサイズ(_縁の幅_ x2 を引く)とオフセット(_縁の幅_ を引く)を補正してみましょう。 |
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]](../static/img/crop/stripes_trim_red_fix.gif)
ここでは、上記で Border オペレーター が拡大・移動させた元の画像のキャンバスサイズとオフセットを復元していることに注目してください。「[-trim](https://imagemagick.org/command-line-options/#trim)」操作自体は、画像の位置を正しく保持していました。見て分かるとおり、これはかなり扱いにくい調整です。あるいは、キャンバスサイズを気にしない場合(レイヤー化された画像では典型的)は、はるかに単純な 相対 Repage を使って、拡大されたキャンバス上の画像の位置だけを調整できます。 |
magick stripes.gif -bordercolor red -border 1x1 -trim \
-repage -1-1\! stripes_trim_red_fix2.gif
画像の片側だけを Trim する
上記で見たとおり、「[-trim](https://imagemagick.org/command-line-options/#trim)」はできる限り多くの側を trim します。異なる側から異なる 2 色を取り除くことさえあります(あるいは、非常に注意深く配置すれば、4 色を取り除くこともできたでしょう)。これは、trim を 1 つの側だけに制限したいときに少し難しくします。確実に 1 つの側だけを trim するには、他の 3 つの側を保護するために、もう一方の側に色の縞を追加する必要があります。ここでは、先ほど作成した「border」画像の「左」つまり「西」側だけを trim する手順を、ステップごとに示します。この例で見やすいよう、必要以上にずっと太い縞を使いました。通常は幅 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 色の縞を追加しています! こうすれば、片方の色が画像を囲む既存の縁の色と一致しても、もう一方が引き続き機能してそれら 3 つの端を保護します。また、2 色のうち片方だけが trim されるので、後始末する色の縞は 1 つだけ残ります。ここでは、片側 trim 全体を単一のコマンドとして示しますが、上端を trim する場合です(縞は下端、つまり「南」端に追加されます)。
![[IM Output]](../static/img/crop/trim_west.gif)
|
magick border.gif -gravity South \
-background white -splice 0x1 -background black -splice 0x1 \
-trim +repage -chop 0x1 trim_north.gif
![[IM Output]](../static/img/crop/trim_north.gif)
そしてこちらは下端だけの trim です。もちろん、前の例で使った「[-gravity](https://imagemagick.org/command-line-options/#gravity)」設定は不要で、設定は画像に対して既定の 'North-West' 設定になります。 |
magick border.gif \
-background white -splice 0x1 -background black -splice 0x1 \
-trim +repage -chop 0x1 trim_south.gif
![[IM Output]](../static/img/crop/trim_south.gif)
もちろん、border の場合と同様に、画像に余分な色を splice すると、ここでも仮想画像キャンバスのサイズとレイヤー画像のオフセットが変わります。これも、前のセクションで示したのと同じ方法で修正できますが、それらの端を保護するために余分な色をどちら側に追加したかによります。
ファジーな色選択での Trim -- 低品質 JPEG 画像
JPEG は「非可逆」なので、画像内の色は一般に単一の色ではなく、わずかに異なる色の帯になります。このため、「[-trim](https://imagemagick.org/command-line-options/#trim)」は JPEG や現実世界の画像ではしばしば失敗します。FUTURE: ここに失敗例 そのため、まったく同じではないが妥当に近い色は同じものとして扱うべきだと、ImageMagick に伝える必要があります。ごく小さな「[-fuzz](https://imagemagick.org/command-line-options/#fuzz)」設定を追加すればこれが行えます。
magick image.jpg -fuzz 1% -trim +repage image_fuzzy_trim.jpg
そのファジーを基準とする特定の色を指定するのも非常に良い考えです。これは、「[-border](https://imagemagick.org/command-line-options/#border)」オペレーターを使ってその色の縁を明示的に追加することで加えられます。縁はもちろん常に trim される色と一致するので、常に「[-trim](https://imagemagick.org/command-line-options/#trim)」によって取り除かれます。FUTURE: ここにファジー縁 trim の例
「ノイズの多い」画像を Trim する -- スキャン画像
同様の問題はスキャン画像でも直面します。スキャナーはしばしば、ほこり、汚れ、スキャナーのわずかな変動、あるいは読み取り装置が拾う単なる電子ノイズによって、単一ピクセルの小さな誤差を生み出します。しかしこの場合のピクセル誤差は、通常、小さな ファジー係数 では克服できないほど大きいので、そうした画像を trim するには別の技法が必要です。最も単純な解決策は、しばしば最も実用的ではありませんが、同じ画像の複数のスキャン(または静止ビデオシーケンスの複数フレーム)を撮り、その結果を平均して干渉を低減することです。しかしこれは、スキャナー上のほこりの斑点を取り除くことはできず、単一の画像やフレームしか利用できない場合には役立たないので、ほとんどの場合この方法は実用的ではありません。実用的な解決策は 2 段階のものです。画像のコピーに対して、単一ピクセルの誤差やスキャナーのほこりを弱める一方、高コントラストの大きな色のかたまりの効果を強めるよう、何らかの方法で処理します。次にこのコピーに「[-trim](https://imagemagick.org/command-line-options/#trim)」を使い、それが何をしたかを正確に調べることで、元の手を加えていない画像を同じ量だけ「[-crop](https://imagemagick.org/command-line-options/#crop)」できます。単一ピクセルの誤差を弱める方法はいくつもあります。これらには「[-blur](https://imagemagick.org/command-line-options/#blur)」、「[-median](https://imagemagick.org/command-line-options/#median)」、あるいは 基本的なモルフォロジーオペレーター を使ってテキストや細い線などの特定のディテールを取り除くことなどが含まれます。この「blur」法は主に 2 つの制御を提供します。
- 無視したいほこりの斑点の大きさを決める、「
[-blur](https://imagemagick.org/command-line-options/#blur)」のシグマ半径、または「[-median](https://imagemagick.org/command-line-options/#mediam)」の畳み込み半径。なお、これらの値はどちらも浮動小数点数にできるので、適用するぼかしの量を細かく制御できます。ぼかしの詳細については 画像のぼかし を参照してください。 - 2 つ目の制御は、「
[-trim](https://imagemagick.org/command-line-options/#trim)」オペレーターが一致させる色の変化の量を制御する「[-fuzz](https://imagemagick.org/command-line-options/#fuzz)」色係数です。つまり、trim を希望する画像にどれだけ近づけたいかです。
たとえば、より小さな「logo:」画像を使ってみましょう。 |
magick logo: -resize 30% noisy.jpg
この小さな画像では、画像内の星とタイトルを、trim に無視させたいノイズとみなすことができます。上記の星は幅約 5 ピクセルなので、trim に基本的にそれらを無視させるために、その約 2 倍の値を使いたいところです。 ![[IM Output]](../static/img/crop/noisy.jpg)
こちらが結果です。なおこの場合、欲しいのは画像ではなく、画像のキャンバス情報だけです。
magick noisy.jpg -virtual-pixel edge -blur 0x15 -fuzz 15% -trim info:
| _ぼかしで正しい「端の効果」が得られるよう、Virtual Pixel 設定を確認する必要があるかもしれません。
あるいは、ぼかす前に同じ背景色の幅広の縁を画像に追加し、オフセット結果を適切に調整することもできます。これは「[-blur](https://imagemagick.org/command-line-options/#blur)」と「[-trim](https://imagemagick.org/command-line-options/#trim)」の両オペレーターからより正確な結果を得るのに、より良いかもしれません。_
---|---
上記の結果から、「[-trim](https://imagemagick.org/command-line-options/#trim)」が内部で '89x121+78+23' という「[-crop](https://imagemagick.org/command-line-options/#crop)」引数を使っていたことが分かります。これは trim された画像の実際のサイズと、その仮想キャンバス上のオフセットであり、おそらく画像内で探している主要な(単一の)オブジェクトの位置です。これを、ぼかされていない元の画像に使えます。 |
magick noisy.jpg -crop 89x121+78+23 +repage noisy_trimmed.jpg
そしてこちらが、ウィザードだけに trim された画像です! ![[IM Output]](../static/img/crop/noisy_trimmed.jpg)
これは、少しの「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:](files.html#info)」の出力を制御するために使われる「[-format](https://imagemagick.org/command-line-options/#format)」設定の詳細については、画像プロパティのエスケープ を参照してください。 ![[IM Output]](../static/img/crop/noisy_trimmed_2.jpg)
| _上記は、生成された「[-crop](https://imagemagick.org/command-line-options/#crop)」引数を外側の「magick」コマンドに挿入するために、バッククォート '...' を使う「コマンド置換」という UNIX コマンドラインシェル機能を使っています。
これは Windows バッチスクリプト でも、特殊な FOR..DO 構文を使って行えます。詳細は上記のリンクをたどってください。_
---|---
なお、ウィザードの手は完全に見えていますが、帽子の先端は見えていません。これがこの方法の欠点で、鋭い先端や細かいディテールを無視してしまいます。しかしそれは、そもそも私たちがそれを無視するよう求めたことです。この方法は、いくらかの FX エスケープ を使って数学を行い、trim された領域を少しだけ(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]](../static/img/crop/noisy_trimmed_3.jpg)
計算された境界が元の画像を超えて拡大した場合、crop オペレーター は自動的にそれを画像の境界に制限します。IMv7(「magick」コマンドを使用)では、計算された trim サイズを後で使うために設定に保存し、これらすべてを 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]](../static/img/crop/noisy_trimmed_4.jpg)
ファジー trim の他の方法としては、さまざまな モルフォロジー的方法 を使って画像の不要な部分を取り除き、元の画像で欲しい領域の境界を見つけるために trim する方法があります。あるユーザー HugoRune は、スキャン目的で、画像をコントラストが大きく異なる領域まで trim する必要がありました。詳細は IM フォーラムでの議論 を参照してください。
![[IM Output]](../static/img/crop/rose.gif)
![[IM Output]](../static/img/crop/crop.gif)
![[IM Output]](../static/img/crop/crop_br.gif)
![[IM Output]](../static/img/crop/crop_tl.gif)
![[IM Output]](../static/img/crop/crop_all.gif)
![[IM Output]](../static/img/crop/crop_miss.gif)
![[IM Text]](../static/img/crop/crop_indent.txt.gif)
![[IM Text]](../static/img/crop/crop_error.txt.gif)
![[IM Text]](../static/img/crop/crop_miss_ident.txt.gif)
![[IM Text]](../static/img/crop/crop_miss_data.txt.gif)
![[IM Output]](../static/img/crop/paged.gif)
![[IM Output]](../static/img/crop/crop_page.gif)
![[IM Output]](../static/img/crop/crop_page_tl.gif)
![[IM Output]](../static/img/crop/crop_page_br.gif)
![[IM Output]](../static/img/crop/crop_page_all.gif)
![[IM Output]](../static/img/crop/crop_page_miss.gif)
![[IM Text]](../static/img/crop/crop_page_ident.txt.gif)
![[IM Output]](../static/img/crop/crop_area_br.png)
![[IM Output]](../static/img/crop/repage.gif)
![[IM Output]](../static/img/crop/repage_br.gif)
![[IM Output]](../static/img/crop/repage_tl.gif)
![[IM Output]](../static/img/crop/repage_all.gif)
![[IM Output]](../static/img/crop/repage_miss.gif)
![[IM Output]](../static/img/crop/crop_vp.gif)
![[IM Output]](../static/img/crop/crop_vp_br.gif)
![[IM Output]](../static/img/crop/crop_vp_tl.gif)
![[IM Output]](../static/img/crop/crop_vp_all.gif)
![[IM Output]](../static/img/crop/crop_vp_miss.gif)
![[IM Text]](../static/img/crop/crop_vp_ident.txt.gif)
![[IM Output]](../static/img/crop/tiles_0.gif)
![[IM Output]](../static/img/crop/tiles_1.gif)
![[IM Output]](../static/img/crop/tiles_2.gif)
![[IM Output]](../static/img/crop/tiles_3.gif)
![[IM Text]](../static/img/crop/tiles_ident.txt.gif)
![[IM Output]](../static/img/crop/tiles_layered.gif)
![[IM Output]](../static/img/crop/rose_tiles_00.gif)
![[IM Output]](../static/img/crop/rose_tiles_01.gif)
![[IM Output]](../static/img/crop/rose_tiles_02.gif)
![[IM Output]](../static/img/crop/rose_tiles_03.gif)
![[IM Output]](../static/img/crop/rose_tiles_04.gif)
![[IM Output]](../static/img/crop/rose_tiles_05.gif)
![[IM Output]](../static/img/crop/rose_tiles_06.gif)
![[IM Output]](../static/img/crop/rose_tiles_07.gif)
![[IM Output]](../static/img/crop/rose_tiles_08.gif)
![[IM Output]](../static/img/crop/rose_tiles_09.gif)
![[IM Output]](../static/img/crop/rose_tiles_10.gif)
![[IM Output]](../static/img/crop/rose_tiles_11.gif)
![[IM Output]](../static/img/crop/rose_rejoined.gif)
![[IM Output]](../static/img/crop/rose_tile_1_1.gif)
![[IM Output]](../static/img/crop/rose_tile_2_1.gif)
![[IM Output]](../static/img/crop/rose_tile_3_1.gif)
![[IM Output]](../static/img/crop/rose_tile_4_1.gif)
![[IM Output]](../static/img/crop/rose_tile_1_2.gif)
![[IM Output]](../static/img/crop/rose_tile_2_2.gif)
![[IM Output]](../static/img/crop/rose_tile_3_2.gif)
![[IM Output]](../static/img/crop/rose_tile_4_2.gif)
![[IM Output]](../static/img/crop/rose_tile_1_3.gif)
![[IM Output]](../static/img/crop/rose_tile_2_3.gif)
![[IM Output]](../static/img/crop/rose_tile_3_3.gif)
![[IM Output]](../static/img/crop/rose_tile_4_3.gif)
![[IM Output]](../static/img/crop/rose_30x20_00.gif)
![[IM Output]](../static/img/crop/rose_30x20_01.gif)
![[IM Output]](../static/img/crop/rose_30x20_02.gif)
![[IM Output]](../static/img/crop/rose_30x20_03.gif)
![[IM Output]](../static/img/crop/rose_30x20_04.gif)
![[IM Output]](../static/img/crop/rose_30x20_05.gif)
![[IM Output]](../static/img/crop/rose_30x20_06.gif)
![[IM Output]](../static/img/crop/rose_30x20_07.gif)
![[IM Output]](../static/img/crop/rose_30x20_08.gif)
![[IM Output]](../static/img/crop/rose_30x20_09.gif)
![[IM Output]](../static/img/crop/rose_30x20_10.gif)
![[IM Output]](../static/img/crop/rose_30x20_11.gif)
![[IM Output]](../static/img/crop/rose_30x20_12.gif)
![[IM Output]](../static/img/crop/rose_30x20_13.gif)
![[IM Output]](../static/img/crop/rose_30x20_14.gif)
![[IM Output]](../static/img/crop/rose_30x20_15.gif)
![[IM Output]](../static/img/crop/rose_ctiles_0.gif)
![[IM Output]](../static/img/crop/rose_ctiles_1.gif)
![[IM Output]](../static/img/crop/rose_ctiles_2.gif)
![[IM Output]](../static/img/crop/rose_ctiles_3.gif)
![[IM Output]](../static/img/crop/rose_ctiles2_0.gif)
![[IM Output]](../static/img/crop/rose_ctiles2_1.gif)
![[IM Output]](../static/img/crop/rose_ctiles2_2.gif)
![[IM Output]](../static/img/crop/rose_ctiles2_3.gif)
![[IM Output]](../static/img/crop/strip_column.gif)
![[IM Output]](../static/img/crop/strip_row.gif)
![[IM Output]](../static/img/crop/strips_0.gif)
![[IM Output]](../static/img/crop/strips_1.gif)
![[IM Output]](../static/img/crop/strips_2.gif)
![[IM Output]](../static/img/crop/strips_3.gif)
![[IM Output]](../static/img/crop/quadrant_tl.gif)
![[IM Output]](../static/img/crop/quadrant_tr.gif)
![[IM Output]](../static/img/crop/quadrant_bl.gif)
![[IM Output]](../static/img/crop/quadrant_br.gif)
![[IM Output]](../static/img/crop/neg_offset_1.gif)
![[IM Output]](../static/img/crop/neg_offset_2.gif)
![[IM Output]](../static/img/crop/neg_offset_3.gif)
![[IM Output]](../static/img/crop/neg_offset_4.gif)
![[IM Output]](../static/img/crop/neg_offset_5.gif)
![[IM Output]](../static/img/crop/rose_23x15_00.gif)
![[IM Output]](../static/img/crop/rose_23x15_01.gif)
![[IM Output]](../static/img/crop/rose_23x15_02.gif)
![[IM Output]](../static/img/crop/rose_23x15_03.gif)
![[IM Output]](../static/img/crop/rose_23x15_04.gif)
![[IM Output]](../static/img/crop/rose_23x15_05.gif)
![[IM Output]](../static/img/crop/rose_23x15_06.gif)
![[IM Output]](../static/img/crop/rose_23x15_07.gif)
![[IM Output]](../static/img/crop/rose_23x15_08.gif)
![[IM Output]](../static/img/crop/rose_23x15_09.gif)
![[IM Output]](../static/img/crop/rose_23x15_10.gif)
![[IM Output]](../static/img/crop/rose_23x15_11.gif)
![[IM Output]](../static/img/crop/rose_23x15_12.gif)
![[IM Output]](../static/img/crop/rose_23x15_13.gif)
![[IM Output]](../static/img/crop/rose_23x15_14.gif)
![[IM Output]](../static/img/crop/rose_23x15_15.gif)
![[IM Output]](../static/img/crop/rose_3x3@_0.gif)
![[IM Output]](../static/img/crop/rose_3x3@_1.gif)
![[IM Output]](../static/img/crop/rose_3x3@_2.gif)
![[IM Output]](../static/img/crop/rose_3x3@_3.gif)
![[IM Output]](../static/img/crop/rose_3x3@_4.gif)
![[IM Output]](../static/img/crop/rose_3x3@_5.gif)
![[IM Output]](../static/img/crop/rose_3x3@_6.gif)
![[IM Output]](../static/img/crop/rose_3x3@_7.gif)
![[IM Output]](../static/img/crop/rose_3x3@_8.gif)
![[IM Output]](../static/img/crop/rose_2x2+20+20@_0.gif)
![[IM Output]](../static/img/crop/rose_2x2+20+20@_1.gif)
![[IM Output]](../static/img/crop/rose_2x2+20+20@_2.gif)
![[IM Output]](../static/img/crop/rose_2x2+20+20@_3.gif)
![[IM Output]](../static/img/crop/montage.gif)
![[IM Output]](../static/img/crop/montage_0.gif)
![[IM Output]](../static/img/crop/montage_1.gif)
![[IM Output]](../static/img/crop/montage_2.gif)
![[IM Output]](../static/img/crop/montage_3.gif)
![[IM Output]](../static/img/crop/montage_4.gif)
![[IM Output]](../static/img/crop/montage-3_0.gif)
![[IM Output]](../static/img/crop/montage-3_1.gif)
![[IM Output]](../static/img/crop/montage-3_2.gif)
![[IM Output]](../static/img/crop/montage-3_3.gif)
![[IM Output]](../static/img/crop/montage-3_4.gif)
![[IM Output]](../static/img/crop/edged.gif)
![[IM Output]](../static/img/crop/edged+6_0.gif)
![[IM Output]](../static/img/crop/edged+6_1.gif)
![[IM Output]](../static/img/crop/edged+6_2.gif)
![[IM Output]](../static/img/crop/edged+6_3.gif)
![[IM Output]](../static/img/crop/edged+6_4.gif)
![[IM Output]](../static/img/crop/edged-6_0.gif)
![[IM Output]](../static/img/crop/edged-6_1.gif)
![[IM Output]](../static/img/crop/edged-6_2.gif)
![[IM Output]](../static/img/crop/edged-6_3.gif)
![[IM Output]](../static/img/crop/edged-6_4.gif)
![[IM Output]](../static/img/crop/edged-8_0.gif)
![[IM Output]](../static/img/crop/edged-8_1.gif)
![[IM Output]](../static/img/crop/edged-8_2.gif)
![[IM Output]](../static/img/crop/edged-8_3.gif)
![[IM Output]](../static/img/crop/edged-8_4.gif)
![[IM Output]](../static/img/crop/tile-shave.gif)
![[IM Output]](../static/img/crop/spaced.gif)
![[IM Output]](../static/img/crop/spaced+6_0.gif)
![[IM Output]](../static/img/crop/spaced+6_1.gif)
![[IM Output]](../static/img/crop/spaced+6_2.gif)
![[IM Output]](../static/img/crop/spaced+6_3.gif)
![[IM Output]](../static/img/crop/spaced+6_4.gif)
![[IM Output]](../static/img/crop/spaced-6_0.gif)
![[IM Output]](../static/img/crop/spaced-6_1.gif)
![[IM Output]](../static/img/crop/spaced-6_2.gif)
![[IM Output]](../static/img/crop/spaced-6_3.gif)
![[IM Output]](../static/img/crop/spaced-6_4.gif)
![[IM Output]](../static/img/crop/border_default.gif)
![[IM Output]](../static/img/crop/border_sides.gif)
![[IM Output]](../static/img/crop/border_topbot.gif)
![[IM Output]](../static/img/crop/border_none.gif)
![[IM Output]](../static/img/images/star.gif)
![[IM Output]](../static/img/crop/star_background.gif)
![[IM Output]](../static/img/crop/border_compose.jpg)
![[IM Output]](../static/img/crop/paged_border.gif)
![[IM Output]](../static/img/crop/frame.gif)
![[IM Output]](../static/img/crop/frame_wierd.gif)
![[IM Output]](../static/img/crop/frame_blue.gif)
![[IM Output]](../static/img/crop/frame_red.gif)
![[IM Output]](../static/img/crop/frame_rasied.gif)
![[IM Output]](../static/img/crop/frame_rasied_part.gif)
![[IM Output]](../static/img/crop/frame_sunken_part.gif)
![[IM Output]](../static/img/crop/frame_sunken.gif)
![[IM Output]](../static/img/crop/frame_normal.gif)
![[IM Output]](../static/img/crop/frame_popped.gif)
![[IM Output]](../static/img/crop/frame_pressed.gif)
![[IM Output]](../static/img/crop/frame_inverted.gif)
![[IM Output]](../static/img/crop/frame_compose.jpg)
![[IM Output]](../static/img/crop/paged_framed.gif)
![[IM Output]](../static/img/crop/shave.gif)
![[IM Output]](../static/img/crop/shave_sides.gif)
![[IM Output]](../static/img/crop/shave_topbot.gif)
![[IM Output]](../static/img/crop/paged_frame.gif)
![[IM Output]](../static/img/crop/paged_shave.gif)
![[IM Output]](../static/img/crop/paged_tile_shave.gif)
![[IM Output]](../static/img/crop/extent_enlarge.gif)
![[IM Output]](../static/img/crop/extent_shrink.gif)
![[IM Output]](../static/img/crop/extent_wider.gif)
![[IM Output]](../static/img/crop/extent_taller.gif)
![[IM Output]](../static/img/crop/extent_north.gif)
![[IM Output]](../static/img/crop/extent_south.gif)
![[IM Output]](../static/img/crop/extent_east.gif)
![[IM Output]](../static/img/crop/extent_west.gif)
![[IM Output]](../static/img/crop/extent_center.gif)
![[IM Output]](../static/img/crop/extent_center2.gif)
![[IM Output]](../static/img/crop/splice.gif)
![[IM Output]](../static/img/crop/splice_column.gif)
![[IM Output]](../static/img/crop/splice_row.gif)
![[IM Output]](../static/img/crop/splice_topleft.gif)
![[IM Output]](../static/img/crop/splice_top.gif)
![[IM Output]](../static/img/crop/splice_bottom.gif)
![[IM Output]](../static/img/crop/splice_left.gif)
![[IM Output]](../static/img/crop/splice_right.gif)
![[IM Output]](../static/img/crop/splice_botright.gif)
![[IM Output]](../static/img/crop/splice_label.gif)
![[IM Output]](../static/img/crop/splice_chop.gif)
![[IM Output]](../static/img/crop/chop.gif)
![[IM Output]](../static/img/crop/chop_splice.gif)
![[IM Output]](../static/img/crop/chop_top.gif)
![[IM Output]](../static/img/crop/chop_left.gif)
![[IM Output]](../static/img/crop/chop_right.gif)
![[IM Output]](../static/img/crop/chop_bottom.gif)
![[IM Output]](../static/img/crop/crop_edge_top.gif)
![[IM Output]](../static/img/crop/crop_edge_left.gif)
![[IM Output]](../static/img/crop/crop_edge_right.gif)
![[IM Output]](../static/img/crop/crop_edge_bottom.gif)
![[IM Text]](../static/img/crop/trim_info.txt.gif)
![[IM Output]](../static/img/crop/stripes.gif)
![[IM Output]](../static/img/crop/stripes_trimmed.gif)
![[IM Output]](../static/img/crop/stripes_trim_red.gif)
![[IM Output]](../static/img/crop/stripes_trim_red_fix2.gif)
![[IM Text]](../static/img/crop/blur_trim_info.txt.gif)