ImageMagick 使用例 -- その他
- ImageMagick 使用例 まえがきと索引
- 補間(ピクセル間のカラールックアップ)
- 単純な補間方式
- Bilinear、Mesh、Catrom、Spline
- 背景上での補間
- 回転した線の補間
-
仮想ピクセル(画像外のカラールックアップ)
-
Edge、Tile、Mirror、Transparent、Black、Gray、White、Background、
HoriziontalTile、HoriziontalTileEdge、VerticalTile、VerticalTileEdge、
CheckerTile、Random、Dither - 仮想ピクセルと無限遠
- 仮想ピクセルの色
- 仮想ピクセルの例
-
ランダムな単色のスポット Annotate 引数の使い方 Splice: 新しい画像演算子の作成 Border、Frame、そして BorderColor の使い方 リスト演算子のテスト このページは ImageMagick のさまざまな側面をテストする例で構成されています。ただし、他の例ページでの議論には(少なくとも形式的には)うまく収まらないものです。また、このページには特定の IM 演算子における versions 引数の結果を示すいくつかの表も含まれています。とはいえ他の人々もこれを行っているので、私に付け加えることがない限り、これ以上は扱いません。
ピクセル補間あるいはピクセル間カラールックアップ
「[-interpolate](https://imagemagick.org/command-line-options/#interpolate)」設定は、元画像から色を調べる際に、その「調べる点」が元画像のピクセルの間に落ちる場合に使われます。これは「[-fx](https://imagemagick.org/command-line-options/#fx)」(DIY 特殊効果演算子)や「[-distort](https://imagemagick.org/command-line-options/#distort)」(一般化画像ゆがみ演算子)、その他の関連演算子である 円形ゆがみ など、さまざまな画像操作で行われます。基本的に「補間」とは、ある点が画像内の実際のピクセルと正確には一致せず、ピクセルとピクセルの間の空間に落ちる場合に、画像からの 直接カラールックアップ をどう解釈すべきかを IM に伝えるものです。例えばピクセル位置 3,4 の色を調べれば、その正確なピクセルの色が得られるはずです。しかし、画像の 3.23,4.75 という点の色を調べたら、IM は何を返すべきでしょうか? 3,4 のピクセルの色を得るべきでしょうか、それとも 3,5 でしょうか? あるいは周囲のピクセルの色を混ぜたものでしょうか、そしてその場合、色はどのように混ぜ合わされるべきでしょうか? ピクセル補間 は、(ピクセル座標で)浮動小数点位置にある単一の色を調べる際に、ImageMagick が何をすべきかを定義します。 補間は、ある意味で リサンプリングフィルター によって提供されるようなピクセルのリサンプリングに似ています。本質的な違いは、リサンプリングには「スケール」「面積」あるいは可変の「ウィンドウ」があり、その領域内のすべてのピクセルを代表する色が返されることです。補間には「スケール」が関与せず、単一の「点」のルックアップと、その点の周囲の固定サイズの「領域」だけがあり、そこからその点で使う色を決定します。もちろん、ほとんどの面積リサンプリングアルゴリズムは、リサンプリングの面積が最小限の動作「ウィンドウ」に達すると補間的な方式に退化する傾向があり、これは画像が拡大あるいはアップサンプリングされる際に自然に起こります。これが 補間フィルター や ガウスぼかしフィルター が画像の拡大により適している理由です。補間は基本的により下位のサンプリング形式であり、「どの色か」という問いに対する単純で高速な答えがほしいときに基本的に使われます。
単純な補間方式
これらは素直で単純な方式で、「点補間」から使う色を返すために可能な限り少ない処理をしようとするものです。最も単純なのは「Nearest 」と「Integer 」で、混合やその他のブレンド効果を一切行わずに、元画像から単一のピクセルの色をそのまま選ぶだけです。これは画像の元の色値を保持しますが、エイリアシング効果という代償があり、典型的には画像が滑らかでない見た目になります。 |
IM v6.7.6-2 以降では、「Nearest」を「Nearest-Neighbour」補間設定の省略形として使えます。 |
|---|---|
この二つは非常によく似ており、ルックアップ座標が元画像からどのピクセルを抽出するかだけが異なります。具体的には「Integer」は単にルックアップ点を切り下げてピクセルを選ぶため、結果として全体的に右下方向へ半ピクセルの平行移動が生じます。これは典型的には元画像の単純化された「スケーリング」でのみ使われます。一方、「Nearest」は浮動小数点のルックアップ座標に最も近いピクセルを選ぶため、より正しい結果を生みます。「Blend 」はサンプリング点からの距離に応じて、最も近い 1、2、または 4 個のピクセルを混ぜ合わせ(平均し)ます。その結果、元のピクセルの色は依然として存在しますが、サイズが半分になり、その間の空間にはブレンドされた色の市松模様が埋まります。(下の例を参照) 「Average 」は実際には正確な色の一致を生むことは決してありませんが、常に周囲の 4 ピクセルを混ぜて局所的な平均を生み出します。これはカラールックアップの状況で役立つことがあります。「Average4」もこの補間方式のエイリアスとして使えます。「Average9 」は似ていますが、サンプリング点の周囲の最も近い 9 ピクセルを平均し、ぼやけた結果を生みます。「Average16 」はサンプリング点の周囲の最も近い 16 ピクセルを平均し、極端にぼやけた結果を生みます。以下は、小さな色付きピクセル群、あるいは単一の白いピクセルを拡大したときの、さまざまな単純な補間方式の概要です。元画像は「Nearest」の結果のように見えますが、もっとずっと小さいものです。 |
for method in integer nearest blend average average9 average16 ; do
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-bordercolor black -border 1 \
-filter point -interpolate $method \
+distort SRT 20,0 ip_color_${method}.jpg
magick xc: -bordercolor black -border 2 \
-filter point -interpolate $method \
+distort SRT 16,0 ip_pixel_${method}.jpg
done
| IM v6.7.7-6 より前は、「Average」は実際には現在の「Average16」に相当するものでした。他の二つの平均化補間器、ならびに「Blend」と「Background」はこのとき追加されました。
---|---
もう一つの単純な補間方式も提供されています。「Background 」は、元画像のどの「サンプリング」に対しても、単に現在の背景色を返します。多くの点でこれはむしろ無用です。なぜなら典型的には、結局のところ何の変哲もない単色の画像になってしまうからです。その主な用途は、リサンプリングの失敗 のような、より複雑なリサンプリング関数のチェックとしてのものです。ここでは(典型的には 一般ゆがみ演算子 から使われる)EWA リサンプリングフィルターが、その「サポート」あるいはリサンプリング領域内でピクセルを見つけられずにリサンプリングが失敗すると、補間ルックアップにフォールバックします。補間を「Background」に設定し、背景色を(「red」のような)目立つものに設定すれば、結果の画像でピクセルを探して、何らかの理由でリサンプリングが「失敗」あるいは「元画像のピクセルをすべて取りこぼした」場所を見ることができます。典型的にはサポート設定が小さすぎるか、エキスパートフィルターオプションをいじったことが原因です。 未来: 補間された領域に対する「random」選択という将来の補間オプションの可能性。手の込んだ補間効果に役立つかもしれません!
Bilinear
「Bilinear 」(あるいは線形補間)は デフォルトの補間方式 であり、ルックアップ点あるいはサンプリング点の周囲のピクセルの色を組み合わせて実際の補間結果を得る、おそらく最も単純な方法の一つです。以下は bilinear 補間がどのように機能するかを説明する図です。
![[diagram]](../static/img/img_diagrams/bilinear_interpolation.jpg)
すなわち、与えられたサンプリング点の色を求めるために、直交する方向に単純に直線を結ぶというものです。この結果は、リサイズで使った場合の 三角形リサンプリングフィルター と等価でもあります。 |
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-size 100x100 xc: +swap -fx 'v.p{i/(w-1),j/(h-1)}' \
interpolate_bilinear.jpg
magick \( xc:white xc:black +append \) \
\( xc:black xc:white +append \) -append \
-size 100x100 xc: +swap -fx 'v.p{i/(w-1),j/(h-1)}' \
interpolate_saddle.jpg
![[IM Output]](../static/img/misc/interpolate_saddle.jpg)
この最後の画像は、4 つの既知の点の間のエッジに沿ってどのように線形グラデーションが形成され、次にそれらのエッジの間に第二の線形グラデーションが形成されるかを示しています。すなわち、周囲のピクセルの間の色は、水平方向と垂直方向の線形グラデーションを使って生成されます。これはひいては、典型的に「鞍(サドル)」として知られる曲がった 2 次元グラデーションを生み出します。これは二つの対角の隅が上がり、他の二つの隅が下がっている形です。この方法を使って 45 度の角度の線形グラデーションをより直接的に生成することもできますが、対角に向かい合う隅に中間色を指定する必要があります。 |
magick \( xc:blue xc:navy +append \) \
\( xc:navy xc:black +append \) -append \
-size 100x100 xc: +swap -fx 'v.p{i/(w-1),j/(h-1)}' \
interpolate_45linear.jpg
![[IM Output]](../static/img/misc/interpolate_45linear.jpg)
このデフォルト補間方式の最も重要な側面は、画像のまさに中心のピクセルが常に 4 つの隅の色すべての平均となり、エッジでは完全な線形グラデーション、隅では正確な色の一致となることです。
Mesh
「[-interpolate](https://imagemagick.org/command-line-options/#interpolate)」設定の「Mesh」は、「[Bilinear](#bilinear)」補間のバリエーションです。「Bilinear」が 3 次元の曲面を生み出すのに対し、「Mesh」はピクセル間の領域を二つの平らな三角形の面に分割するように設計されています。領域を二つの三角形に分割するのは、最も「近い」二つの隅の色を持つ対角線に基づいています。 |
「Mesh」アルゴリズムの詳細については、論文 Image Interpolation by Pixel-Level Data-Dependent Triangulation を参照してください。 |
|---|---|
| 例えば、上で使ったのと同じ隅の色の組を使ってみましょう。 |
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-size 100x100 xc: +swap -interpolate Mesh \
-fx 'v.p{i/(w-1),j/(h-1)}' interpolate_tri-mesh.jpg
![[IM Output]](../static/img/misc/interpolate_tri-mesh.jpg)
ご覧のとおり、「Mesh」アルゴリズムは「[Bilinear](#bilinear)」とほぼ正確に同じ色の補間の組を生み出しました。しかし、黄色とシアンの色を入れ替えると…… |
magick \( xc:red xc:blue +append \) \
\( xc:cyan xc:yellow +append \) -append \
-size 100x100 xc: +swap -interpolate Mesh \
-fx 'v.p{i/(w-1),j/(h-1)}' interpolate_tri-mesh2.jpg
![[IM Output]](../static/img/misc/interpolate_tri-mesh2.jpg)
今回は「Mesh」アルゴリズムは「blue」と「cyan」の色が最も近い二つの隅だと判断し、これら二つの隅の間に対角の線形グラデーションを作りました。残りの色は、この線から他の二つの隅へ向かう単純な平らな三角形のグラデーションを形成します。これは普通でない補間に見えるかもしれませんが、この方法は、色画像がわずかにリサイズ、回転、せん断されたときに、鋭い境界がかなり鋭いまま保たれることを保証します。実際、適応的リサイズ操作(「[-adaptive-resize](https://imagemagick.org/command-line-options/#adaptive-resize)」)は、結果の過度のぼやけを減らすために、小さな画像のリサイズでこの事実を利用しています。例えば単一の「白い」隅がある場合、「mesh」はエッジが見つかったと仮定し、このエッジを際立たせるように補間された色を調整します。 |
magick \( xc:black xc:black +append \) \
\( xc:white xc:black +append \) -append \
-size 100x100 xc: +swap -interpolate Mesh \
-fx 'v.p{i/(w-1),j/(h-1)}' interpolate_tri-mesh3.jpg
![[IM Output]](../static/img/misc/interpolate_tri-mesh3.jpg)
もちろん、色がそこそこ一貫したグラデーションを生むなら、「mesh」補間もそこそこ一貫したグラデーションを生み出します。 |
magick \( xc:blue xc:navy +append \) \
\( xc:black xc:black +append \) -append \
-size 100x100 xc: +swap -interpolate Mesh \
-fx 'v.p{i/(w-1),j/(h-1)}' interpolate_tri-mesh4.jpg
![[IM Output]](../static/img/misc/interpolate_tri-mesh4.jpg)
ご覧のとおり、結果はかなり妥当なグラデーションですが、よく見れば二つの別々の三角形の対角の接合部が見えます。この変化は bi-linear ほど滑らかではありません(bi-linear も厳密には滑らかではありませんが)。しかしこれらは、リサイズやゆがみを加えた画像の鋭いエッジを保とうとしているわけでもありません。
Catrom(Catmull-Rom)
「[-interpolate](https://imagemagick.org/command-line-options/#interpolate)」設定の「Catrom」(一般に不正確に「BiCubic」補間として知られています)は、点ルックアップの色を決定するうえでより複雑です。基本的に、ピクセル間領域の隅の色だけを見るのではなく、さらに進んで、それら最近傍ピクセルを超えた色まで見ます。サンプリング点の周囲 4x4 の領域内、合計 16 ピクセルです。基本的には、使うべき最良の全体的な色を決定するために、関与する領域全体に曲線をフィットさせます。以下は、このプロセスをおそらくより分かりやすく説明する図です……
![[diagram]](../static/img/img_diagrams/bicubic_interpolation.jpg)
そして以下が、私たちの標準的な 4 つの色に対する補間された色です。 |
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-size 100x100 xc: +swap -interpolate Catrom \
-fx 'v.p{i/(w-1),j/(h-1)}' interpolate_catrom.jpg
![[IM Output]](../static/img/misc/interpolate_catrom.jpg)
上の画像は「[Bilinear](#bilinear)」補間と非常によく似て見えるかもしれませんが、結果は補間された色を生み出すのに直線ではなく、より滑らかなブレンド曲線になっています。とはいえこの画像が示していないのは、最近傍の 4 つを取り囲む他のピクセルの効果です。それを見るには、もう少し広い領域を見る必要があります。この特定の(非常に小さな)例では、周囲のピクセルは 仮想ピクセル 設定によって制御されます。
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-size 100x100 xc: +swap -interpolate Catrom -virtual-pixel edge \
-fx 'v.p{3*i/(w-1)-1, 3*j/(h-1)-1}' interpolate_catrom_edge.jpg
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-size 100x100 xc: +swap -interpolate Catrom -virtual-pixel White \
-fx 'v.p{3*i/(w-1)-1, 3*j/(h-1)-1}' interpolate_catrom_white.jpg
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-size 100x100 xc: +swap -interpolate Catrom -virtual-pixel Black \
-fx 'v.p{3*i/(w-1)-1, 3*j/(h-1)-1}' interpolate_catrom_black.jpg
| 実際の画像では、仮想ピクセル の効果は通常、画像のまさに端の近くの結果にだけ影響します。この画像はわずか 2 ピクセル幅なので、上の例は強く影響を受けています。これはより大きな典型的な画像では当てはまりません。
---|---
ご覧のとおり、曲線は周囲の色に強く影響され、結果として非常に鋭くきつい色の変化になるか、周囲の色によって定義される、よりブレンドされた色の変化になります。しかし、周囲のピクセルの色の強い変化が、その色の反転あるいはネガの小さな領域を生み出すこともわかります。これは リンギングアーティファクト であり、典型的には実際の画像において補色どうしの極端に鋭いエッジでのみ見られます。 | _非常に非常に強い色のエッジでのこのリンギング効果は、クリッピングされて恐ろしいピクセルの線を生じることがあります。この問題は、リサイズと補間を「RGB」とは異なるカラースペース、たとえば「Lab」や「Luv」カラースペースで行うことで防げます。
この問題のさらなる情報と例については、LAB カラースペースでのリサイズ を参照してください。
---|---
| 「BiCubic」(補間された 3 次フィルター)は非常に大きなフィルターのファミリーを指すため、その意味は非常に不正確であることに注意してください。とはいえ依然として利用可能ですが、その使用は非推奨で、より正確な名前が好まれます。
IM v6.7.7-7 以降、「BiCubic」は単に「Catrom」のエイリアスであり、これは典型的に良い「3 次補間器」(b=0, c=1/2)とみなされています。何を補間に使っているかを明確にするため、「BiCubic」ではなく「Catrom」という名前を使うべきです。
IM v6.7.7-7 より前は、「BiCubic」は実際には極端な「Cardinal Cubic」フィルター(b=0, c=1)を使っており、これは過度に強い負のリンギング効果を持っていました。これは「Catrom」によって完全に置き換えられ、補間関数としてはもはや利用できません。
IM v6.3.5-3 より前は、「BiCubic」は非常にぼやけた「Spline」3 次補間器として実装されていました。そのフィルターはこのバージョンの ImageMagick で名前が変更されました。(次を参照)
Spline
「Spline」補間方式は、上の「[Catrom](#catrom)」と同様に、最も近い 16 ピクセルを使います。ただしこれは非常にぼやけた、ガウス的な補間です。 |
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-size 100x100 xc: +swap -interpolate spline \
-fx 'v.p{i/(w-1),j/(h-1)}' interpolate_spline.jpg
![[IM Output]](../static/img/misc/interpolate_spline.jpg)
ご覧のとおり、上の「Spline」補間のまさに隅の色は、補間された面が実際にはそれらのピクセルの元の色を通らないため、くすんでいます。本質的には過度に「ぼかされ」ており、より正確には「B-Spline」面として知られています。この面は依然として 3 次フィルター の一種(b=1, c=0)で、区分的な 3 次曲線という技法を使って生成されます。しかしこの曲線は元のピクセルの色に近づくだけで、特に強い色の変化のある領域でそうです。すなわち、正確な整数ピクセル位置の補間ルックアップは、その実際のピクセルの色を返さず、周囲のピクセルとぼかし合わされた色を返します。これはしばしば悪いことだと思われていますが、一般的な平滑化関数として使えます。「[Catrom](#catrom)」と同様に、これも周囲のピクセルの影響を受けます。
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-size 100x100 xc: +swap -interpolate Spline -virtual-pixel edge \
-fx 'v.p{3*i/(w-1)-1, 3*j/(h-1)-1}' interpolate_spline_edge.jpg
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-size 100x100 xc: +swap -interpolate Spline -virtual-pixel White \
-fx 'v.p{3*i/(w-1)-1, 3*j/(h-1)-1}' interpolate_spline_white.jpg
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-size 100x100 xc: +swap -interpolate Spline -virtual-pixel Black \
-fx 'v.p{3*i/(w-1)-1, 3*j/(h-1)-1}' interpolate_spline_black.jpg
| 実際の画像では、仮想ピクセル の効果は画像の端でのみ生じます。ルックアップが行われるピクセル間領域を取り囲む実際のピクセルがあるからです。
---|---
ここでは、ピクセルの色に対する「spline」曲線のフィットが悪いことに起因する色のくすみの効果が見えます。結果は一般に、色付き領域や細い線のエッジがよりぼやけたものになります。しかしこれらは、「[Catrom](#catrom)」補間で得られるような負の「リンギング」効果を示すことも決してありません。
補間の背景
補間の効果はしばしばより広い領域に及ぶため、ここでは白または黒の周囲ピクセルを伴う 4 つの主要な補間方式の拡大図を示します。
for method in bilinear mesh catrom spline ; do
for vpixel in white black ; do
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-size 100x100 xc: +swap -interpolate $method -virtual-pixel $vpixel \
-fx 'v.p{3*i/(w-1)-1, 3*j/(h-1)-1}' ip_area_${method}_$vpixel.jpg
done
done
ご覧のとおり、周囲の背景色は「[bilinear](#bilinear)」で補間された色には実質的な効果がありません。存在するどんな背景色の上にも単に重ねられているだけのように見えます。一方、「[mesh](#mesh)」がどのようにより強く鋭いエッジを生成するかはわかりますが、画像の端で関与する場合、周囲の色に応じて対角線を反転することを決められます。赤と青の接合部を、白と黒の背景の間で見て、この「反転」を確認してください。「[catrom](#catrom)」と「[spline](#spline)」の補間曲線は周囲のピクセルの影響を受けます。特に絶対色を含むテストケースでそうです。そして最後に、「[spline](#spline)」補間は実際には単に画像のガウス的なぼかし(シグマ 0.65 を使用)にすぎません。あらゆる「リンギング」やエイリアシング効果を排除するのに十分なぼかしですが、典型的にはほとんどの用途には過度にぼやけています。ガウスフィルター を参照してください。
回転した線の補間
ここでは、垂直な線の画像を作り、アフィンゆがみを使ってその線を 17 度回転させ、生成されたアンチエイリアスのピクセルが見えるように表示を拡大することで、さまざまな補間方式を実演します。
magick -size 10x20 xc: -draw 'line 4,0 4,20' \
-scale 50x100 ip_line_none.gif
for method in integer nearest bilinear mesh catrom spline; do
magick -size 10x20 xc: -draw 'line 5,0 5,20' \
-interpolate $method -filter point -distort SRT 17 \
-scale 50x100 ip_line_${method}.gif
done
![[IM Output]](../static/img/misc/ip_line_none.gif)
未回転 | | ![[IM Output]](../static/img/misc/ip_line_integer.gif)
Integer | ![[IM Output]](../static/img/misc/ip_line_nearestneighbor.gif)
Nearest | ![[IM Output]](../static/img/misc/ip_line_bilinear.gif)
Bilinear | ![[IM Output]](../static/img/misc/ip_line_mesh.gif)
Mesh | ![[IM Output]](../static/img/misc/ip_line_catrom.gif)
Catrom | ![[IM Output]](../static/img/misc/ip_line_spline.gif)
Spline
---|---|---|---|---|---|---|---
ご覧のとおり、直接カラールックアップ方式の「Interger」と「NearestNeighbor」は強くエイリアシングした結果を生みますが、画像内にある元の色だけを使います。この二つの主な違いは、「Interger」が結果の画像を半ピクセル分、下と左へ押し出す傾向があることです。「Bilinear」「Mesh」「Catrom」は一般に非常に良く、また似た結果を生み(これについては後述)、後者は非常に鋭い回転線を生みます。これらのいずれも一般に良い解決策とみなされます。「Spline」補間方式は、エイリアシング効果を取り除くため、細い線の独特なぼかしを生みます。しかし「Spline」は結果を過度にぼかす傾向があり、回転線というより、グラデーションの平滑化に本当に向いています。 |
上の例の特別な設定「[-filter](#filter) point」は、ゆがみ演算子 が最終的なピクセルの色を決定する際に単一の「点」補間のみを使うことを保証するために使われています。これがないと、補間ルックアップ の代わりに 面積リサンプリング が使われます。ただしそれも非常に良い結果を生みます。 |
|---|---|
_これらの例には「[-rotate](https://imagemagick.org/command-line-options/#rotate)」演算子を使わなかったことに注意してください。なぜならその演算子は画像を 回転 させるのにピクセルせん断法を使うからです。その結果、ピクセル補間は使われません。 |
このように「[-rotate](https://imagemagick.org/command-line-options/#rotate)」演算子を使う例と、その結果のピクセルレベルの効果については、細い線の回転 を参照してください。
更新: IMv6.7.3-4 以降、rotate 演算子は内部的に ゆがみ演算子 を使うようになったため、上記はもはや当てはまらないかもしれません。
回転したエッジの補間
領域のエッジがゆがめられる場合、単一のピクセルの線がゆがめられる場合と比べて、結果にわずかな違いがあります。
magick -size 10x20 xc: -draw 'rectangle 0,0 4,19' \
-scale 50x100 ip_edge_none.gif
for method in integer nearest bilinear mesh catrom spline; do
magick -size 10x20 xc: -draw 'rectangle 0,0 4,19' \
-interpolate $method -filter point -distort SRT -17 \
-scale 50x100 ip_edge_${method}.gif
done
![[IM Output]](../static/img/misc/ip_edge_none.gif)
未回転 | | ![[IM Output]](../static/img/misc/ip_edge_integer.gif)
Integer | ![[IM Output]](../static/img/misc/ip_edge_nearestneighbor.gif)
Nearest | ![[IM Output]](../static/img/misc/ip_edge_bilinear.gif)
Bilinear | ![[IM Output]](../static/img/misc/ip_edge_mesh.gif)
Mesh | ![[IM Output]](../static/img/misc/ip_edge_catrom.gif)
Catrom | ![[IM Output]](../static/img/misc/ip_edge_spline.gif)
Spline
---|---|---|---|---|---|---|---
上は概ね自明です。「Bilinear」と「Mesh」は一般的な回転に対してそこそこ鋭いエッジを生み、「Catrom」はゆがめられた画像でより鋭いエッジを生みます。「Spline」はしかし、よりぼやけたエッジを生みます。「Bilinear」と「Mesh」の違いは上記の場合では極めて軽微です。この二つの方式が目に見える違いを生むのは、本当にゆがみ操作中の極端な拡大の場合だけです。それ以外では、ピクセルの強度のかろうじて気づく程度のわずかな変化しか見えません。
仮想ピクセル — 画像外のカラールックアップ
多くの演算子は、画像本来の境界の外に落ちる色を調べる必要がしばしばあります。これには 画像のぼかし、一般画像ゆがみ、モルフォロジー演算子と畳み込み演算子、一般ゆがみ演算子、さらには非常に古い インプロージョン演算子 のための演算子が含まれます。では -22,-3 の位置のピクセルを求めたら、どんな色が返されるべきでしょうか? そのようなピクセルは実際には存在しませんが、返される色の値は、画像処理全体に対する全体的な効果、とりわけ画像の実際の端に近いピクセルの結果の色に、広範囲に及ぶ効果を持ちえます。「[-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel)」設定は、画像の通常の境界の外のピクセルにアクセスする際に IM が何を返すべきかを定義します。
例えば、ここでは FX DIY 演算子「[-fx](https://imagemagick.org/command-line-options/#fx)」を使って、小さな画像の内側と周囲のすべてのピクセルを「調べて」表示し、デフォルト の「[-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel)」設定が何を返したかを見られるようにします。 |
magick -size 70x70 xc: tree.gif \
-fx 'v.p[-19,-19]' virtual_default.gif
![[IM Output]](../static/img/misc/virtual_default.gif)
「Edge 」の「[-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel)」設定は、要求された「仮想」位置に最も近い実際のピクセルの色を返します。すなわち、最も近い「エッジ」の色です。今回は、はるかに遅い FX 演算子 の代わりに、より高速な viewport を伴う画像ゆがみ を使って周囲の仮想ピクセルを表示します。ゆがみ方式「SRT 0」は実際には画像結果をゆがめず、画像演算子が実際に見るピクセル、とりわけ元画像を取り囲む「仮想」のピクセルを見るだけです。 |
magick tree.gif -set option:distort:viewport 70x70-19-19 \
-virtual-pixel Edge -filter point -distort SRT 0 \
+repage virtual_edge.gif
![[IM Output]](../static/img/misc/virtual_edge.gif)
「Edge」仮想ピクセル設定はデフォルト設定なので、上は前の例と同じになるはずです。この設定は一般に、画像を処理する際に(エッジ効果という点で)最も影響が小さくなります。これがデフォルト設定に選ばれた理由でもあります。これは ぼかし や、処理にピクセルの「近傍」を使う他の モルフォロジー・畳み込み 演算子を使う際に特に重要です。隅のピクセルの色が、実際の画像を取り囲む対角に隣接する領域を完全に埋め尽くしてしまう点に注目することは重要です。これにより単一の隅のピクセルが、さまざまな画像変換に大きな効果を持つことがあります。この「隅」の効果は、画像をぼかす際に特に顕著です。 「Tile 」VP 設定は、画像処理のエッジ効果を画像の境界の周りに巻き付かせ、それを保証するのに非常に役立ちます。 |
magick tree.gif -set option:distort:viewport 70x70-19-19 \
-virtual-pixel Tile -filter point -distort SRT 0 \
+repage virtual_tile.gif
![[IM Output]](../static/img/misc/virtual_tile.gif)
これにより、作業中の画像が「タイル化可能」のままであること、あるいは画像が変更されるにつれてより「タイル化可能」になることを保証できます。さらなる例については タイル画像の変更 を参照してください。 「Mirror 」は「[tile](#tile)」と非常によく似ており、デフォルトの「[edge](#edge)」よりも一部の効果に向いているかもしれません。 |
magick tree.gif -set option:distort:viewport 70x70-19-19 \
-virtual-pixel Mirror -filter point -distort SRT 0 \
+repage virtual_mirror.gif
![[IM Output]](../static/img/misc/virtual_mirror.gif)
これは、ぼかされる画像のエッジと隅の効果を減らすのに特に役立ちます。しかし、他の効果を生み出すこともできます。 | _IM v6.5.0-1 までは、元画像に直接付随する画像のみがミラーされていました。元画像からさらに離れた他の仮想コピーは、ミラーされないまま(通常のタイルパターン)でした。これは修正され、隣接する仮想コピーだけでなく、仮想キャンバス空間全体が正しくミラータイルされるようになりました。
これは、一般ゆがみ演算子 でミラータイルを使って、遠い地平線を眺める ときのように非常に広い領域をミラータイルする場合にのみ重要になります。_
---|---
「Transparent 」は、実際の画像の境界の外のピクセルに対して単に透明色を返します。 |
magick tree.gif -alpha set -set option:distort:viewport 70x70-19-19 \
-virtual-pixel Transparent -filter point -distort SRT 0 \
+repage virtual_trans.gif
![[IM Output]](../static/img/misc/virtual_trans.gif)
上記の Alpha「set」演算子 は、透明色が正しく埋め込まれるように、画像がマットあるいはアルファチャンネルを持つことを保証するために必要です。この設定がないと、上記は透明ではなく「黒」の色を返すことがあります。なぜなら色「none」あるいは「完全に透明な黒」がデフォルトの透明色だからです。例えば、ここでは誤って透明性をオフにします…… |
magick tree.gif -alpha off -set option:distort:viewport 70x70-19-19 \
-virtual-pixel Transparent -filter point -distort SRT 0 \
+repage virtual_trans2.gif
![[IM Output]](../static/img/misc/virtual_trans2.gif)
「Transparent」設定は、ゆがめられた画像が後でより大きな画像を構築するために「レイヤー化」される画像のゆがみで特に役立ちます。例えば、3D アフィンキューブ や 3D 透視ボックス です。 「white 」「gray 」「black 」設定は、上記の前の「Transparent」設定と似ています。境界の外に落ちるどのピクセルに対しても、その特定の色を返すだけです。 |
magick tree.gif -alpha off -set option:distort:viewport 70x70-19-19 \
-virtual-pixel White -filter point -distort SRT 0 \
+repage virtual_white.gif
magick tree.gif -alpha off -set option:distort:viewport 70x70-19-19 \
-virtual-pixel Gray -filter point -distort SRT 0 \
+repage virtual_gray.gif
magick tree.gif -alpha off -set option:distort:viewport 70x70-19-19 \
-virtual-pixel Black -filter point -distort SRT 0 \
+repage virtual_black.gif
![[IM Output]](../static/img/misc/virtual_black.gif)
他の任意の単色がほしい場合は、その色を「[-background](https://imagemagick.org/command-line-options/#background)」設定で定義し、「Background 」の「[-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel)」設定を使う必要があります。 |
magick tree.gif -set option:distort:viewport 70x70-19-19 \
-virtual-pixel Background -background coral \
-filter point -distort SRT 0 +repage virtual_bgnd.gif
「HorizontalTile 」VP 設定は、完全な 360 度の「[Arc](distorts.html#arc)」と「[Polar](distorts.html#polar)」ゆがみに役立つ特別な形式のタイル化として IM v6.4.2-6 で追加されました。画像は水平方向にのみタイル化され、タイルの上下の仮想ピクセルは現在の「[-background](https://imagemagick.org/command-line-options/#background)」色から設定されます。 |
magick tree.gif -set option:distort:viewport 70x70-19-19 \
-virtual-pixel HorizontalTile -background coral \
-filter point -distort SRT 0 +repage virtual_horizontal.gif
![[IM Output]](../static/img/misc/virtual_horizontal.gif)
これにより、変換される画像が水平方向に「タイル化可能」のままであることを保証できます。さらなる例については タイル画像の変更 を参照してください。 「HorizontalTileEdge 」(IM v6.5.0-1 で追加)も画像を仮想空間にわたって水平にタイル化しますが、側面のエッジのピクセルを仮想キャンバス空間の他の部分にわたって複製します。 |
magick tree.gif -set option:distort:viewport 70x70-19-19 \
-virtual-pixel HorizontalTileEdge -background coral \
-filter point -distort SRT 0 +repage virtual_horizontal_edge.gif
![[IM Output]](../static/img/misc/virtual_horizontal_edge.gif)
これら二つの VP 方式は、円環状の画像が「巻き付いて」端と端で結合する、完全な円の「[Arc](../static/img/distorts#arc)」と「[Polar](../static/img/distorts#polar)」ゆがみをより良く扱うために追加されました。
同様に「VerticalTile 」VP 設定(これも IM v6.4.2-6 で完全性のために追加)は、画像を垂直方向にのみタイル化し、現在の「[-background](https://imagemagick.org/command-line-options/#background)」色を使って画像の両側を埋めます。 |
magick tree.gif -set option:distort:viewport 70x70-19-19 \
-virtual-pixel VerticalTile -background coral \
-filter point -distort SRT 0 +repage virtual_vertical.gif
![[IM Output]](../static/img/misc/virtual_vertical.gif)
「VerticalTileEdge 」は IM v6.5.0-1 で追加され、側面のエッジのピクセルを仮想キャンバス空間の残りの部分にわたって複製します。 |
magick tree.gif -set option:distort:viewport 70x70-19-19 \
-virtual-pixel VerticalTileEdge -background coral \
-filter point -distort SRT 0 +repage virtual_vertical_edge.gif
![[IM Output]](../static/img/misc/virtual_vertical_edge.gif)
IM v6.5.0-1 では「CheckerTile 」が追加され、市松模様を埋めるかのように画像をタイル化します。他の升目は単に背景色(透明でもよい)で埋められます。 |
magick tree.gif -set option:distort:viewport 70x70-19-19 \
-virtual-pixel CheckerTile -background coral \
-filter point -distort SRT 0 +repage virtual_checker.gif
![[IM Output]](../static/img/misc/virtual_checker.gif)
背景を透明にし、その画像を同じサイズの別の完全にタイル化された画像の上に重ねることで、二つのタイル化をレイヤー化して、二つの画像が交互に並ぶ市松模様を生み出せます。 |
magick -size 96x96 tile:balloon.gif \
\( tree.gif -alpha set -set option:distort:viewport 96x96 \
-virtual-pixel CheckerTile -background none \
-filter point -distort SRT 0 \) \
-flatten virtual_checker_2.gif
さらにいくつか、もっと変わった「[-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel)」設定があります。 「random 」は、画像からランダムなピクセルを選んで使うだけです。 |
magick tree.gif -set option:distort:viewport 70x70-19-19 \
-virtual-pixel Random -filter point -distort SRT 0 \
+repage virtual_random.gif
![[IM Output]](../static/img/misc/virtual_random.gif)
これはしばしば「[-blur](https://imagemagick.org/command-line-options/#blur)」と一緒に使われ、それが生み出すエッジ効果の中に粗いまだら模様の平均的な画像色を生成します。ピクセルの値は一貫しておらず、「[-seed](https://imagemagick.org/command-line-options/#seed)」で乱数生成器に初期値を与えない限り、ルックアップごと、さらには操作の実行ごとに異なる効果を生むことに注意してください。これは 畳み込み や モルフォロジー 画像処理で使うときに特にまずいです。なぜなら、同じピクセルのルックアップが使われても、画像の端に沿った各ルックアップが異なる値を寄与するからです。とはいえ、ランダムパターンは 透視地平線 を生成するときには非常に良いことがわかりました。地平線に近づくにつれて、パターンがよりぼやけた結果を見せるからです。このぼかしが、結果のランダムテクスチャに、単純な単色を使ったのでは見えないであろう奥行きを与えます。
「dither 」はしかし、要求された位置から 32x32 ピクセル以内のピクセルに基づいた、順序付きディザリングの色のパターンを返します。つまり、画像から 32 ピクセルを超えて進むと、結果は再び単に画像の隅のピクセルの色になります。これは「[edge](#edge)」と「[random](#random)」を融合させたようなものです。 |
magick tree.gif -set option:distort:viewport 120x120-44-44 \
-virtual-pixel Dither -filter point -distort SRT 0 \
+repage virtual_dither.gif
![[IM Output]](../static/img/misc/virtual_dither.gif)
上では、この 32x32 ピクセル画像の一隅にある太陽の黄色が、右下の隅のはるか上まで選ばれているのがわかりますが、それより先には及びません。すなわち、順序付きディザの色選択における 32 ピクセルの「近傍」の限界です。この画像がもっと大きければ、太陽の黄色の色は他の隅には届きません。このパターンは「ランダム」ではなく、同じ画像に対しては常に同じ結果を生成します。画像に近いところでは、より順序付けられた形の「[random](#random)」VP と考えてよいですが、画像本体から 32 ピクセルを超えて処理すると「[edge](#edge)」のような効果になります。
仮想ピクセルと無限遠
一般ゆがみ演算子 の結果、とりわけ無限の距離に向かってゆがんだ眺めを作れる 透視 ゆがみを使うと、「[-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel)」の効果をはるかに明確に見ることができます。例えば、ここでは「[-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel) dither」設定の結果を、tree の透視図で示します。これは、この設定が無限遠まで返されるピクセルにどう影響しうるかを示しています。
magick tree.gif -mattecolor DodgerBlue -virtual-pixel dither \
-set option:distort:viewport 150x100-50-50 \
-distort perspective '0,0 9,0 31,0 38,0 0,31 0,18 31,31, 40,18' \
perspective_dither.gif
上記を他の「[-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel)」設定で試して、それらがどう機能するかをよりよく理解してください。他のいくつかの例は 遠い地平線を眺める でも見られます。上の眺めの「空」は実際には「[-mattecolor](https://imagemagick.org/command-line-options/#mattecolor)」設定から生成されており、これは distort が「無効」な領域、この場合は透視ゆがみの「空」を表現するために使われることに注意してください。それは「[-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel)」設定から来たものではありません。
仮想ピクセルの色
「[-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel)」方式のいずれも、単色方式の一つ — 「[background](#background)」「[transparent](#transparent)」「[background](#background)」「[black](#black)」「[white](#white)」「[gray](#gray)」 — を通じて特に要求された色でない限り、画像内にすでに存在する色とは異なる色や合成色を実際に返すことはありません。すなわち、新しい色が生成されることは決してありませんが、一つの特定の色は追加されえます(一般ゆがみ演算子 では二つ)。もちろん、上の透視ゆがみの眺めのように、要求されたピクセルが ピクセル補間 されたり 面積リサンプリング されたりする場合は、それらの方式が、選ばれた「[-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel)」設定に応じて返された色を混ぜることがあります。
演算子への仮想ピクセルの効果
ここでは「[-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel)」設定のさまざまな演算子への効果を探ります。「[-blur](https://imagemagick.org/command-line-options/#blur)」…… |
magick -size 70x70 xc:lightblue -fill black -draw 'circle 35,65 25,55' \
-virtual-pixel edge -blur 0x8 vp_blur.png
magick -size 70x70 xc:lightblue -fill black -draw 'circle 35,65 25,55' \
-virtual-pixel mirror -blur 0x8 vp_blur_2.png
![[IM Output]](../static/img/misc/vp_blur_2.png)
次の例では、「[-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel)」設定の「tile」を伴う「[-blur](https://imagemagick.org/command-line-options/#blur)」によって、画像がどのように相互に混入しうるかに注目してください。もちろん、画像が最初からタイル化可能であれば、これは望ましいかもしれません。 |
magick -size 70x70 xc:lightblue -fill black -draw 'circle 35,65 25,55' \
-virtual-pixel tile -blur 0x8 vp_blur_3.png
![[IM Output]](../static/img/misc/vp_blur_3.png)
画像の「[-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel)」に特定の色を設定すると、非常に興味深い効果と可能性が生まれます。 |
magick -size 70x70 xc:lightblue -fill black -draw 'circle 35,65 25,55' \
-virtual-pixel background -background blue \
-blur 0x8 vp_blur_4.png
magick -size 70x70 xc:lightblue -fill black -draw 'circle 35,65 25,55' \
-virtual-pixel transparent -channel RGBA -blur 0x8 \
-background red -flatten vp_blur_5.png
![[IM Output]](../static/img/misc/vp_blur_5.png)
画像の背後に置いた「red」の背景が、結果のぼかされた画像が画像の実際のピクセルを取り囲む仮想ピクセルを利用したエッジの周りに見えていることに注目してください。「[-gaussian](https://imagemagick.org/command-line-options/#gaussian)」は「[-blur](https://imagemagick.org/command-line-options/#blur)」と基本的に同じ結果になりますが、これは両者が数学的に同一であることから理解できます。 |
magick -size 70x70 xc:lightblue -fill black -draw 'circle 35,65 25,55' \
-virtual-pixel background -background blue \
-gaussian 0x8 vp_gaussian.png
![[IM Output]](../static/img/misc/vp_gaussian.png)
しかし「[-radial-blur](https://imagemagick.org/command-line-options/#radial-blur)」(実際には回転ぼかし)は、より興味深い境界効果を生みます…… |
magick -size 70x70 xc:lightblue \
-virtual-pixel background -background blue \
-radial-blur 0x30 vp_radial.png
![[IM Output]](../static/img/misc/vp_radial.png)
この最後の、デフォルトの「透明エッジ」を伴うものは、より大きな放射ぼかし角度で使われると、おそらく滑らかなエッジを生成します。他の技法よりも、よりきれいな「ビネット」あるいは柔らかいエッジのオーバーレイ画像を生むかもしれません。この効果を使う例については 柔らかくぼかしたエッジ を参照してください。「[-motion-blur](https://imagemagick.org/command-line-options/#motion-blur)」はエッジ効果に非常にひどく影響されることがあることに注意してください。 | 「[-motion-blur](https://imagemagick.org/command-line-options/#motion-blur)」が、その効果を特定のチャンネルに限定するための「[-channel](https://imagemagick.org/command-line-options/#channel)」の使用を現在理解していないという事実によって、これは悪化します。
---|---
|
magick -size 70x70 xc:none -virtual-pixel edge \
-fill yellow -stroke red -strokewidth 3 -draw 'circle 45,55 35,45' \
-channel RGBA -motion-blur 0x12+65 vp_motion.png
magick -size 70x70 xc:none -virtual-pixel transparent \
-fill yellow -stroke red -strokewidth 3 -draw 'circle 45,55 35,45' \
-channel RGBA -motion-blur 0x12+65 vp_motion_2.png
magick -size 70x70 xc:none -virtual-pixel background -background blue \
-fill yellow -stroke red -strokewidth 3 -draw 'circle 45,55 35,45' \
-channel RGBA -motion-blur 0x12+65 vp_motion_3.png
仮想ピクセルのインプロージョン効果
以下は、さまざまな「-virtual-pixel」設定を使った、さまざまな大きな値(>1.0)のインプロージョンの、もっと興味深い例です。
for v in edge tile mirror dither random gray; do
for i in 2 5 10 50 500; do \
magick koala.gif -virtual-pixel $v \
-implode $i implode_${v}_${i}.gif
done
done
上記の結果の「点々とした」性質は、「-implode」演算子が使う直接の「補間サンプリング」の直接的な結果です。直接補間ルックアップ を参照してください。これは将来のバージョンの IM で、面積リサンプリング を使って変わるかもしれません。今のところ、結果を改善するには スーパーサンプリング の技法を使う必要があります。「edge」設定は、ほとんどの奇妙な効果を避けるために使われる、より普通のデフォルト設定です。他のもの(「background」を除く)は、本質的に画像内の既存のピクセルから複製パターンを生み出し、効果は非常に変わりやすいものです。また、同様の効果の増加に対して、引数がサイズの指数関数的な増加を要する点にも注意してください。さらに、約 200 より大きい引数では、結果の画像の中心に黒い円が現れることがあります。これはコンピュータの数学的な限界に達したことが原因です。そのような大きな値を使うことは、お勧めしない効果です。
ランダムな単色のスポット
「plasma:fractal」キャンバスをぼかし、次に色を非常に低い値まで減らすことで、異なる色のランダムな領域を含む単純な画像を作れます。ただし、結果は要求された最終的な色数や 仮想ピクセル 設定(上記参照)に大きく依存します。この実験で初期のランダム画像には二つの選択肢がありました。フラクタルプラズマ画像 と ランダムノイズ画像 です。ランダム画像 はその性質上、(「tile」の「[-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel)」設定を使えば)よりタイル化可能な画像を作れる画像を生みます。一方、プラズマ画像 は色のスポットに矩形のようなエッジを作る傾向があります。他方で、プラズマ画像 はかなり良いパステル色のスポット、あるいはブロブを生みます。一方、ランダム画像 は中間色のグレーの恐ろしい色合いを生む傾向があります。このため、私はこれらの実験に プラズマ画像 を使うことにしました。
magick -size 80x80 plasma:fractal -normalize spot_start.gif
#magick -size 80x80 xc: +noise Random \
# -virtual-pixel tile -blur 0x5 -normalize spot_start.gif
for n in 2 3 4 5; do
for v in edge mirror tile white black; do
magick spot_start.gif -virtual-pixel $v -blur 0x10 \
+dither -colors $n spot${n}_${v}.gif
done
done
最初の 3 つの画像は、色の「スポット」が画像の端とどう相互作用するかに非常に特有の効果を持っています。「Edge」と「Mirror」は色が 90 度の角度で端に接する原因になる傾向があります。「Random」または「Dither」設定は、色のブロブが画像の端に接する点で似ていますがより強く、どちらも画像の端の近くにいくらか鋭いエッジ効果も導入します。スポットのエッジをきれいにして滑らかにするには、二度目の blur-quantize サイクルが必要かもしれません。「Tile」設定は、スポットが画像の周りを巻き付くようにする傾向があります。しかし、元の プラズマ 画像自体がタイル化可能でないため、結果は矩形の端の近くで全体的に色が変わります。もしタイル化可能な ランダム 画像をソースに使えば、色のスポットは画像の境界を完全に無視するでしょう。「White」または「Black」の背景 virtual-pixel 設定を使うと、色のスポットは画像本体の中心に寄る傾向があります。この「中心寄せ」がどれだけうまくいくかは、元のランダム画像が使われた「背景色」に対してどれだけ異なっていたかに依存します。「[-blur](https://imagemagick.org/command-line-options/#blur)」のサイズは基本的に、ブロブのサイズと滑らかさに影響します。小さなぼかしはたくさんの小さなスポットを生み、上で使ったような大きなぼかしは、単一のより円形の色のスポットを生みます。
また、異なる色量子化のカラースペースを使うことで、まったく異なる色の組と相互作用を生み出せます。例えば、ここでは上の最後の例(5 色に減らす)を繰り返しますが、色の選択にもっと変わった「[-quantize](https://imagemagick.org/command-line-options/#quantize)」カラースペースを使います。(色の量子化とカラースペース を参照)
上のすべての画像が、同じランダム化された元画像から生成されたことを思い出してください。見られる異なる効果は、画像の色数を減らす異なる方法の結果です。「[-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel)」設定が、画像境界の外の領域を blur がどう見るかを定義することが、色の領域の形に強い影響を持つことがわかります。
Annotate 引数の使い方
IM バージョン 6 は、テキスト描画のための新しいコマンドラインオプション「[-annotate](https://imagemagick.org/command-line-options/#annotate)」を提供しました。これは古い「[-draw](https://imagemagick.org/command-line-options/#draw)」方式を迂回して、Annotate() API を直接使います。これはコマンドラインユーザーにいくつかの新機能を提供します。この例では、回転がかなり明確になるよう、まっすぐな字体を持つ Arial Black フォントを選びました。 |
magick -font ArialB -pointsize 24 -gravity center \
-size 55x55 xc:white -annotate 0x0+0+0 'Text' \
annotate_source.jpg
**-annotate {_SlewX_}x{_SlewY_}+{_X_}+{_Y_} 'Text String' **
上記の X と Y オフセットは、描画される注釈テキストの gravity に影響された位置です。しかし SlewX と SlewY は回転の一形態を表します。これら二つの値が同じであれば、通常の回転が行われます。しかし異なれば、非常に興味深い効果が生じることがあります……
ご覧のとおり、いくつかの引数では、基本的にテキストがすべて単一の線で描かれることになる場合に、テキストが描かれない結果になりました。これは予想どおりです。しかし、テキストを上下反転、左右反転、回転、イタリック化など、あらゆる方法で描けることがわかります。最も役立つ画像演算子です。
Splice: 新しい画像演算子の作成
ImageMagick バージョン 6 の最初のリリースの直後、ある質問への応答として議論が発展しました。その質問は、画像の中央に余分な空間(行と列)を追加することに関するものでした。下の例は、IM バージョン 6 の強力な魔法を使ってこの議論から生まれた複雑な一連のコマンドで、何をすべきかを正確に詳述しています。この例から「[-splice](https://imagemagick.org/command-line-options/#splice)」演算子が作られました(詳細は 画像への行と列の挿入と切り取り の例を参照)。すなわち、このコマンドラインはこの新しいコマンドの定義となる操作であり、両者はまったく同じように機能するはずです。 |
magick rose: -size 20x10 xc:blue -background blue \
\( -clone 0 -crop 40x0 +repage +clone -insert 1 +append \) \
-swap 0,-1 +delete +repage \
\( -clone 0 -crop 0x30 +repage +clone -insert 1 -append \) \
-delete 0 -delete 0 +repage splice_rose_seq.gif
![[IM Output]](../static/img/misc/splice_rose_seq.gif)
上記では、rose をたくさんの垂直なスライスに分割し、次にそれらをすべて再び連結する前に、その並びに間隔の画像を挿入します。基本的には、rose 画像にピクセルの垂直な列を追加しました。次に、元の画像を変更したものに置き換えて、同じ操作を、ただし水平に繰り返しました。作業画像を少し片付けて、完成です。この例はまた、バージョン 6 ImageMagick の新しい順序付きコマンドライン処理と画像シーケンス操作の有用性をメーリングリストに際立たせました。古いリリースの IM では、同じ結果を達成するのに多数の別々のコマンドと一時画像が必要だったでしょう。
Border、Frame、そして BorderColor の使い方
「[-bordercolor](https://imagemagick.org/command-line-options/#bordercolor)」は「[-border](https://imagemagick.org/command-line-options/#border)」や「[-frame](https://imagemagick.org/command-line-options/#splice)」で画像に境界を追加するためだけに使われるべきだ、という議論があります。すなわち、多くのユーザーは、透明性を持つ画像の背後の背景を設定するためには使われるべきでないと考えています。例えば、IM ではこれが star 画像の透明な領域を「[-bordercolor](https://imagemagick.org/command-line-options/#bordercolor)」に設定し、「[-background](https://imagemagick.org/command-line-options/#background)」色設定を完全に無視します。 |
magick star.gif -bordercolor LimeGreen -background Gold \
-border 10 star_border.gif
![[IM Output]](../static/img/misc/star_border.gif)
「[-bordercolor](https://imagemagick.org/command-line-options/#bordercolor)」が透明画像の背景を設定するのに使われる主な理由は、透明性を含みうるランダムな画像の組が与えられたときに、ユーザーからの最小限の設定で「magick montage」がうまく出てくるようにするためです。 |
magick montage star.gif -frame 6 -geometry '64x64+5+5>' star_montage.gif
![[IM Output]](../static/img/misc/star_montage.gif)
透明性が保持されていたら、上の「magick montage」の結果はこれほど良くは見えなかったでしょう。とはいえ、「[-border](https://imagemagick.org/command-line-options/#border)」や「[-frame](https://imagemagick.org/command-line-options/#splice)」演算子を使うときに画像の透明性を保持できないという意味ではありません。透明性を保持するよう IM に伝える追加の「[-compose](https://imagemagick.org/command-line-options/#compose)」設定を与える必要があるというだけです。 |
magick star.gif -bordercolor LimeGreen \
-compose Copy -border 10 star_border_copy.gif
magick montage star.gif -bordercolor LimeGreen \
-compose Copy -background None -frame 6 \
-geometry '64x64+0+0>' star_montage_copy.gif
![[IM Output]](../static/img/misc/star_border_copy.gif)
![[IM Output]](../static/img/misc/star_montage_copy.gif)
「[-border](https://imagemagick.org/command-line-options/#border)」や「[-frame](https://imagemagick.org/command-line-options/#splice)」を追加しつつ画像の透明な背景を保持することについてのさらなる情報は 境界の追加 を、「magick montage」については montage の背景と透明性の扱いの例 を参照してください。提案された一つの代替案は、これらの演算子で画像領域の背景を「[-background](https://imagemagick.org/command-line-options/#background)」色に設定することでしたが、これは「magick montage」でのその使用を妨げます。もちろん、追加のフレームや境界を加える前に、自分で画像の 透明性を除去 することもいつでもできます。その場合、「-compose Copy」の使用は無関係になります。 |
magick montage star.gif -background Gold -alpha remove \
-frame 6 -geometry '64x64+5+5>' -size 16x16 \
-bordercolor LimeGreen -background SeaGreen \
star_montage_texture.gif
![[IM Output]](../static/img/misc/star_montage_texture.gif)
透明性を保持するには、境界にそれを保持させて他の問題を引き起こすよりも、「[-compose](https://imagemagick.org/command-line-options/#compose)」設定を使うほうがずっと簡単です。新しいユーザーには明らかでないかもしれませんが、まさにそれがこれらの例ページの目的なのです。
リスト演算子のテスト
以下のコマンドはすべて正確に同じ画像を生成するはずですが、すべての画像がわずかに異なる方法で生成されており、新しい IM バージョン 6 の 画像リスト演算子 を実演しています。 |
magick eye.gif news.gif storm.gif +append list_test_01.gif
magick \( \) eye.gif news.gif storm.gif +append list_test_02.gif
magick eye.gif news.gif storm.gif \( \) +append list_test_03.gif
magick \( eye.gif news.gif storm.gif \) +append list_test_04.gif
magick \( eye.gif news.gif storm.gif +append \) list_test_05.gif
magick eye.gif \( news.gif storm.gif +append \) +append list_test_06.gif
magick \( eye.gif news.gif +append \) storm.gif +append list_test_07.gif
magick \( storm.gif -flop \) \( news.gif -flop \) \( eye.gif -flop \) \
+append -flop list_test_08.gif
magick \( eye.gif -rotate 90 \) \( news.gif -rotate 90 \) \
\( storm.gif -rotate 90 \) -append -rotate -90 list_test_09.gif
magick eye.gif tree.gif news.gif storm.gif -delete 1 \
+append list_test_10.gif
magick eye.gif tree.gif news.gif storm.gif -delete -3 \
+append list_test_11.gif
magick eye.gif news.gif storm.gif tree.gif +delete \
+append list_test_12.gif
magick news.gif storm.gif eye.gif +insert +append list_test_13.gif
magick eye.gif storm.gif news.gif -insert 1 +append list_test_14.gif
magick news.gif eye.gif storm.gif -swap 0,1 +append list_test_15.gif
magick storm.gif news.gif eye.gif -swap 0 +append list_test_16.gif
magick eye.gif storm.gif news.gif +swap +append list_test_17.gif
magick eye.gif storm.gif news.gif \( -clone 1 \) \
-delete 1 +append list_test_18.gif
magick eye.gif -negate \( +clone -negate \) news.gif storm.gif \
-delete 0 +append list_test_19.gif
magick storm.gif news.gif eye.gif \( -clone 2,1,0 \) \
-delete 2,1,0 +append list_test_20.gif
magick storm.gif news.gif eye.gif \( -clone 2-0 \) \
-delete 0-2 +append list_test_21.gif
magick {balloon,medical,present,shading}.gif -delete 0--1 \
{eye,news,storm}.gif +append list_test_22.gif
magick balloon.gif -delete 0,0,0,0,0,0,0,0,0 \
eye.gif news.gif storm.gif +append list_test_23.gif
magick eye.gif balloon.gif news.gif storm.gif \
-delete 1,1,1,1,1 +append list_test_24.gif
magick {balloon,medical,present,shading}.gif {eye,news,storm}.gif \
-delete 0--4 +append list_test_25.gif
magick eye.gif news.gif storm.gif \
-delete 0--4 +append list_test_26.gif
magick storm.gif news.gif eye.gif -reverse +append list_test_27.gif
![[IM Output]](../static/img/misc/ip_color_integer.jpg)
![[IM Output]](../static/img/misc/ip_color_nearest.jpg)
![[IM Output]](../static/img/misc/ip_color_blend.jpg)
![[IM Output]](../static/img/misc/ip_color_average.jpg)
![[IM Output]](../static/img/misc/ip_color_average9.jpg)
![[IM Output]](../static/img/misc/ip_color_average16.jpg)
![[IM Output]](../static/img/misc/interpolate_bilinear.jpg)
![[IM Output]](../static/img/misc/interpolate_catrom_edge.jpg)
![[IM Output]](../static/img/misc/interpolate_catrom_white.jpg)
![[IM Output]](../static/img/misc/interpolate_catrom_black.jpg)
![[IM Output]](../static/img/misc/interpolate_spline_edge.jpg)
![[IM Output]](../static/img/misc/interpolate_spline_white.jpg)
![[IM Output]](../static/img/misc/interpolate_spline_black.jpg)
![[IM Output]](../static/img/misc/ip_area_bilinear_white.jpg)
![[IM Output]](../static/img/misc/ip_area_mesh_white.jpg)
![[IM Output]](../static/img/misc/ip_area_catrom_white.jpg)
![[IM Output]](../static/img/misc/ip_area_spline_white.jpg)
![[IM Output]](../static/img/misc/ip_area_bilinear_black.jpg)
![[IM Output]](../static/img/misc/ip_area_mesh_black.jpg)
![[IM Output]](../static/img/misc/ip_area_catrom_black.jpg)
![[IM Output]](../static/img/misc/ip_area_spline_black.jpg)
![[IM Output]](../static/img/misc/virtual_white.gif)
![[IM Output]](../static/img/misc/virtual_gray.gif)
![[IM Output]](../static/img/misc/virtual_bgnd.gif)
![[IM Output]](../static/img/misc/virtual_checker_2.gif)
![[IM Output]](../static/img/misc/perspective_dither.gif)
![[IM Output]](../static/img/misc/vp_blur.png)
![[IM Output]](../static/img/misc/vp_blur_4.png)
![[IM Output]](../static/img/misc/vp_motion.png)
![[IM Output]](../static/img/misc/vp_motion_2.png)
![[IM Output]](../static/img/misc/vp_motion_3.png)
![[IM Output]](../static/img/misc/implode_edge_2.gif)
![[IM Output]](../static/img/misc/implode_tile_2.gif)
![[IM Output]](../static/img/misc/implode_mirror_2.gif)
![[IM Output]](../static/img/misc/implode_dither_2.gif)
![[IM Output]](../static/img/misc/implode_random_2.gif)
![[IM Output]](../static/img/misc/implode_gray_2.gif)
![[IM Output]](../static/img/misc/implode_edge_5.gif)
![[IM Output]](../static/img/misc/implode_tile_5.gif)
![[IM Output]](../static/img/misc/implode_mirror_5.gif)
![[IM Output]](../static/img/misc/implode_dither_5.gif)
![[IM Output]](../static/img/misc/implode_random_5.gif)
![[IM Output]](../static/img/misc/implode_gray_5.gif)
![[IM Output]](../static/img/misc/implode_edge_10.gif)
![[IM Output]](../static/img/misc/implode_tile_10.gif)
![[IM Output]](../static/img/misc/implode_mirror_10.gif)
![[IM Output]](../static/img/misc/implode_dither_10.gif)
![[IM Output]](../static/img/misc/implode_random_10.gif)
![[IM Output]](../static/img/misc/implode_gray_10.gif)
![[IM Output]](../static/img/misc/implode_edge_50.gif)
![[IM Output]](../static/img/misc/implode_tile_50.gif)
![[IM Output]](../static/img/misc/implode_mirror_50.gif)
![[IM Output]](../static/img/misc/implode_dither_50.gif)
![[IM Output]](../static/img/misc/implode_random_50.gif)
![[IM Output]](../static/img/misc/implode_gray_50.gif)
![[IM Output]](../static/img/misc/implode_edge_500.gif)
![[IM Output]](../static/img/misc/implode_tile_500.gif)
![[IM Output]](../static/img/misc/implode_mirror_500.gif)
![[IM Output]](../static/img/misc/implode_dither_500.gif)
![[IM Output]](../static/img/misc/implode_random_500.gif)
![[IM Output]](../static/img/misc/implode_gray_500.gif)
![[IM Output]](../static/img/misc/spot2_edge.gif)
![[IM Output]](../static/img/misc/spot2_mirror.gif)
![[IM Output]](../static/img/misc/spot2_tile.gif)
![[IM Output]](../static/img/misc/spot2_white.gif)
![[IM Output]](../static/img/misc/spot2_black.gif)
![[IM Output]](../static/img/misc/spot3_edge.gif)
![[IM Output]](../static/img/misc/spot3_mirror.gif)
![[IM Output]](../static/img/misc/spot3_tile.gif)
![[IM Output]](../static/img/misc/spot3_white.gif)
![[IM Output]](../static/img/misc/spot3_black.gif)
![[IM Output]](../static/img/misc/spot4_edge.gif)
![[IM Output]](../static/img/misc/spot4_mirror.gif)
![[IM Output]](../static/img/misc/spot4_tile.gif)
![[IM Output]](../static/img/misc/spot4_white.gif)
![[IM Output]](../static/img/misc/spot4_black.gif)
![[IM Output]](../static/img/misc/spot5_edge.gif)
![[IM Output]](../static/img/misc/spot5_mirror.gif)
![[IM Output]](../static/img/misc/spot5_tile.gif)
![[IM Output]](../static/img/misc/spot5_white.gif)
![[IM Output]](../static/img/misc/spot5_black.gif)
![[IM Output]](../static/img/misc/spot_RGB_edge.gif)
![[IM Output]](../static/img/misc/spot_RGB_mirror.gif)
![[IM Output]](../static/img/misc/spot_RGB_tile.gif)
![[IM Output]](../static/img/misc/spot_RGB_white.gif)
![[IM Output]](../static/img/misc/spot_RGB_black.gif)
![[IM Output]](../static/img/misc/spot_YIQ_edge.gif)
![[IM Output]](../static/img/misc/spot_YIQ_mirror.gif)
![[IM Output]](../static/img/misc/spot_YIQ_tile.gif)
![[IM Output]](../static/img/misc/spot_YIQ_white.gif)
![[IM Output]](../static/img/misc/spot_YIQ_black.gif)
![[IM Output]](../static/img/misc/spot_HSL_edge.gif)
![[IM Output]](../static/img/misc/spot_HSL_mirror.gif)
![[IM Output]](../static/img/misc/spot_HSL_tile.gif)
![[IM Output]](../static/img/misc/spot_HSL_white.gif)
![[IM Output]](../static/img/misc/spot_HSL_black.gif)
![[IM Output]](../static/img/misc/spot_XYZ_edge.gif)
![[IM Output]](../static/img/misc/spot_XYZ_mirror.gif)
![[IM Output]](../static/img/misc/spot_XYZ_tile.gif)
![[IM Output]](../static/img/misc/spot_XYZ_white.gif)
![[IM Output]](../static/img/misc/spot_XYZ_black.gif)
![[IM Output]](../static/img/misc/spot_OHTA_edge.gif)
![[IM Output]](../static/img/misc/spot_OHTA_mirror.gif)
![[IM Output]](../static/img/misc/spot_OHTA_tile.gif)
![[IM Output]](../static/img/misc/spot_OHTA_white.gif)
![[IM Output]](../static/img/misc/spot_OHTA_black.gif)
![[IM Output]](../static/img/misc/annotate_source.jpg)
![[IM Output]](../static/img/misc/annotate_montage.jpg)
![[IM Output]](../static/img/misc/list_test_01.gif)
![[IM Output]](../static/img/misc/list_test_02.gif)
![[IM Output]](../static/img/misc/list_test_03.gif)
![[IM Output]](../static/img/misc/list_test_04.gif)
![[IM Output]](../static/img/misc/list_test_05.gif)
![[IM Output]](../static/img/misc/list_test_06.gif)
![[IM Output]](../static/img/misc/list_test_07.gif)
![[IM Output]](../static/img/misc/list_test_08.gif)
![[IM Output]](../static/img/misc/list_test_09.gif)
![[IM Output]](../static/img/misc/list_test_10.gif)
![[IM Output]](../static/img/misc/list_test_11.gif)
![[IM Output]](../static/img/misc/list_test_12.gif)
![[IM Output]](../static/img/misc/list_test_13.gif)
![[IM Output]](../static/img/misc/list_test_14.gif)
![[IM Output]](../static/img/misc/list_test_15.gif)
![[IM Output]](../static/img/misc/list_test_16.gif)
![[IM Output]](../static/img/misc/list_test_17.gif)
![[IM Output]](../static/img/misc/list_test_18.gif)
![[IM Output]](../static/img/misc/list_test_19.gif)
![[IM Output]](../static/img/misc/list_test_20.gif)
![[IM Output]](../static/img/misc/list_test_21.gif)
![[IM Output]](../static/img/misc/list_test_22.gif)
![[IM Output]](../static/img/misc/list_test_23.gif)
![[IM Output]](../static/img/misc/list_test_24.gif)
![[IM Output]](../static/img/misc/list_test_25.gif)
![[IM Output]](../static/img/misc/list_test_26.gif)
![[IM Output]](../static/img/misc/list_test_27.gif)