ImageMagick の例 --
描画
目次
IM での描画は、既存の画像に新しい要素を追加する方法です。多くのテキスト描画は、複合フォント効果と画像注釈の例のページで説明されていますが、このページでは「
「
「
回転した楕円を作成する方法の例については、プッシュ/ポップコンテキストも参照してください。
線と曲線をより適切に描画する方法は、SVG パス描画を使用することです。これは、はるかに汎用性があり、「相対線描画」も可能です。
これらの最後の 2 つの塗りつぶしタイプの操作は、現在「
制御点の 1 つを移動して、同じ「結び目」の他の制御点からの接続された「結び目」を通して「反射」しないようにすると、曲線は不連続になります。
制御点を再び移動して、関連する「結び目」点と一致するようにすると、線は「曲線」なしでその点から直接になります。
両方の制御点をそれぞれの「結び目」に設定すると、直線が生成されます。
「
物事をシンプルにするために、「
ただし、透明色と半透明色を描画する場合、これらの関数は同じではありません。ここでは、3 ピクセルの赤色画像(拡大)があります。2 番目または中央のピクセルでは、「
すべての「
しかし、最初の結果でわかるように、エッジに沿った一部のピクセルは置き換えられていません。これらのピクセルは、選択されたピクセルと全く同じ色ではないため、無視されました。わずかなファジー係数を追加すると、元の色に似た色も含まれるようになります。上記の2番目の例に示すとおりです。もちろん、「ファジー係数」は、そのようなエッジピクセルをすべて捉えるわけではないため、優れた解決策ではありません。これは、これらの「塗りつぶし」メソッドすべてに共通する問題であり、一般的な解決策はありません。画像自体から色を選択するのではなく、特定の既知の色を置き換えたい場合は、代わりに「
領域を色で塗りつぶすことには問題がないわけではありません。色は、薄い境界を越えて、望ましくない領域に漏れる可能性があります(この例については、背景パターン上のGIFを参照してください)。または、選択した領域を端まで正確に塗りつぶせない場合があります(アンチエイリアシングと塗りつぶしの問題を参照してください)。しかし、機能はします。「
最後の描画色のメソッドは「
これは、既存の画像から無地の単色(またはタイル状の画像)のキャンバスを生成する簡単な方法を提供するため、非常に便利です。(この方法や他の同様の方法については、既存の画像に合わせたサイズのキャンバスを参照してください。)将来の課題:「
「
「
円のエッジを見てください。実際にはあまり滑らかに見えません。顕著な階段状の効果が見られます。それは、線形RGBカラースペースで円を描いたためです。しかし、その後、画像をまるでsRGBカラースペースであるかのように保存しました!
これで、円のエッジが実際には滑らかで丸く、あるべき姿になりました。これを正しく行うには、実際にはカラースペースを使用して補正を行う必要があります。ただし、IMはRGBを保存のデフォルトのカラースペースと見なしているため、正しく機能させるためにはトリッキーな処理を行う必要があります。
実際(IMv7)の画像を使用して正しく描画(または「線形」画像処理を行う)するには、まず既存のガンマを削除し、画像を処理してから、そのガンマ補正を復元する必要があります。詳細については、カラースペース補正を使用したサイズ変更を参照してください。実際の画像に描画する例を次に示します。最初に色補正(未処理)なしで、次にガンマおよびカラースペース補正を使用します。
ガンマまたはカラースペース補正を使用すると、線が直接描画した場合に見られるギザギザの「階段状」エイリアシング効果がなく、非常に滑らかに見えることがわかります。(それを見るには非常に優れたモニターが必要です)
デフォルト設定は「
上記の例から、`「
非常に大きなストローク幅を使用する例を次に示します。
「
ストロークの使用例の詳細については、複合フォント効果を参照してください。特に、「バルーン効果」をご覧ください。
線の色は、"
また、"
しかし、"
たとえば、このコマンドは非常に太い線を生成すると思うでしょう。実際にはそうですが、"
しかし、ストローク色も定義されている場合は、要求された太い線が得られます...
"
もちろん、この知識を身につければ、フォント描画と同じように、クリエイティブに活用することができます。
ここでは、上記のフォントと同様に、最も細い"
これにより、黒い点と灰色のセグメントで構成される、非常に奇妙な点線という結果になります。これは、ストローク、塗りつぶし、および背景色の間の奇妙な「色のビート周波数」の結果です。線の拡大図を次に示します...
この効果は、傾斜した線でのみ表示され、純粋な水平または垂直の線では表示されません。水平または垂直の線では、エイリアシングの影響がなく、したがって「色のビート周波数」効果もありません。
ここでは、拡大図でさまざまな下の塗りつぶし色を使用しました。これにより、色が結果のビートをどのように変化させるかを確認できます。
ご覧のとおり、非常に細い線を描画する場合、塗りつぶし色とストローク色を同じにするか、いずれかの色をnoneに設定してオフにすることで、その「ビート」を減らすことができます。後者が最善のアイデアですが、前者は特定のプログラミングニーズに適している場合があります。塗りつぶし線の太さは「0」であることに注意してください。ただし、ストローク線はより太くすることができます。また、浮動小数点値でもあります!2.5ピクセル幅の線は完全に有効です。
2つの黒い部分(実際に描画されたもの)は、実際には互いに重なり合っています!言い換えれば、描画されたポリゴンを使用して2つの領域を個別に描画しようとしたにもかかわらず、塗りつぶされた領域は要求されたものよりもわずかに大きくなっています。また、2つの画像を(プラス合成)に追加して、描画された黒い領域の重なりを実際に見ることができるようにしました。2つのポリゴンが完全に適合した場合、「追加された」描画は単色の白色になります。実際の重なり合う量は、デフォルトの"
ご覧のとおり、「カラー塗りつぶし」プリミティブの特別な設定は、MVG に直接対応するものはありません。つまり、「-bordercolor」と「-fuzz」ファクターの設定です。これらは、「
「-draw」MVG 引数内で、そのグローバル設定をローカルに上書きできます...
ただし、単一の「-draw」MVG 引数内で設定された設定は、その「-draw」操作の期間のみ存在します。つまり、「-draw」内の設定は、その描画に対してのみローカルであり、後続の別の「-draw」引数には引き継がれません。
多くの操作を実行する予定がある場合は、複数の「-draw」操作ではなく、単一の MVG 文字列ですべて実行する方が良い場合があります。
'
ただし、'
オブジェクトは中心の周りに同じ角度方向で描画されたため、2 つの閉じたループは、サイクル値が 2 の領域を囲みます。そのため、'
これは、移動方向に対してオブジェクトの「内側」を同じ側に保つように方向を逆にするだけで、オブジェクトに「穴」を生成できることを意味します。
結果は、'
「大きい」および「スイープ」パラメーターは、パスコンポーネントの開始点から終了点まで「弧」をどのように描画するかを 4 つの方法のうちどれにするかを決定するために使用されるため、特に重要です。
2 番目のフラグ「スイープ」は、単純に、直線のパスの方向のどちら側に弧を描画するかを決定します。「大きい」フラグは、楕円の中心を回る長いパスを選択するために使用されます。つまり、弧のセット角度が 180 度よりも大きくなります。オフにすると、楕円の中心を含まず、180 度未満の角度で弧を描く小さい「弧」が得られます。'Z' で弧を閉じると、最後の直線セグメントが描画されます。完全な楕円または円を作成するには、少なくとも 2 つの「弧」セグメントが必要になり、最初の点から 2 番目の点に移動し、次に最初の点に戻ります。両方の弧は、同じ「スイープ」設定を持つ必要があり、弧が異なる方向に進むため、異なる側に配置されます。いずれかの弧に「大きい」設定を設定する必要があります。
線が、指定された角度で指定された楕円のサイズに適合するには長すぎる場合、楕円のサイズは、線を中心とした楕円で線に適合するように拡大されます。これは、軸の半径に小さい数値を使用すると、軸長の比率を指定するだけで、直接の線路が楕円の中心点を通過することを保証できることを意味します。つまり、パスは楕円の一方の側からもう一方の側への楕円の直径を形成します。これは必ずしも楕円の長軸または短軸ではなく、楕円の直径にすぎません。
もちろん、長さ「
2 つの点の中央に配置された完全な円の場合は、以下を使用します...
'弧' の SVG 定義では、2 つの半径のいずれかがゼロの場合、直線を描画する必要があるとも宣言されています。したがって、「
弧に非常に大きな半径を指定し、復帰パスに「大きいスイープ」を指定しない場合、2 点間のその半径のレンズ形状を作成できます。
このタイプの弧は重要な機能です。これにより、それ以外の場合は直線であるものに、小さくても明確な曲線を非常に簡単に与えることができます。たとえば、次のような単純な三角形の代わりに...
各線を大きな半径の弧に置き換えて、わずかな曲線を与えることができます。
線の終点には変更はなく、各 '
直線で構成されていた「静的」な三角形は、今では風を受けて膨らむ帆のように見えます。線を本当の線分に戻すことなく完全に直線にしたい場合は、円弧の半径をゼロにすることでカーブをオフにできます。したがって、円弧は楕円や円を生成するのに適しているだけでなく、直線やわずかにカーブした線分を描画するのにも役立ちます。これは、非常に汎用性の高い点から点への描画パスです。分離されたカーブした線分を生成するための楕円弧を使用する簡単な代替手段の1つは、代わりに2次ベジェセグメントを使用することです。主な違いは、円弧を定義するために円の半径ではなく、単一の制御点を使用することです。これにより、線分の片方の端にカーブを偏らせることができますが、対称的な円弧を生成するのが難しくなります。もちろん、両方を使用することで「ミックスアンドマッチ」することもできます。 円グラフの例 円弧の使用を終えるために、円弧を使用して円形の扇形を生成する例を示します。もちろん、必要な終点のパスポイントを決定するには、外部の三角関数 (高校数学はどれくらい得意でしたか?) を使用する必要がある場合があります。
すべての円弧は「ラインパス」の左側に描画され、それに応じて (「sweep」フラグを使用して) フラグが設定されていることに注意してください。ただし、円弧が180度を超える角度をカバーする場合は、「large」フラグを設定する必要があります。上記の例の最後の「ゴールド」コンポーネントを参照してください。また、境界線を2回描画する必要がある場合でも、各セクションを完全に描画する必要があることにも注意してください。そうしないと、そのセクションが完全に色で塗りつぶされないか、塗りつぶし色が以前に描画されたセクションの輪郭を重ねてしまう可能性があります。複数の線の重複を回避する唯一の方法は、塗りつぶされたすべての領域を描画してから、輪郭を描画するように繰り返すことです。つまり、すべてを2回描画し、正しく一致するようにする必要があります。したがって、輪郭の重複は、おそらく最も単純な解決策です。 3次ベジェ カーブは、2つの制御点と最終終点を定義する '
パスセグメントのパス上の最終点 (制御線) に制御点を接続する線は、基本的にパス上のその点を通るカーブの方向を定義します。長い制御線は、その点でより滑らかなカーブを生成しますが、短い線は、その点でよりシャープなカーブを生成します。制御点がカーブの点と一致する場合 (制御線の長さがゼロの場合)、直線セグメントのみが使用された場合のように、カーブはその点で鋭い不連続性を持つことになります。より実用的な例として、次のコードは、IM Examples Logo Generator Script から抽出されたものであり、IM Examples Logo のカーブしたスプラッシュ領域を作成します。例の難しい部分は、使用する3次ベジェパス文字列を、ベジェカーブの生成に使用される制御線を示す別のパスに変換するマジックを行っていることです。これにより、カーブの制御線の角度と長さを見ることができ、結果を調整するのがはるかに簡単になります。カーブとコントロールの両方を示すために調整する必要があるポイントのセットは1つだけなので、ミスを最小限に抑えることができます。
画像をよく見ると、カーブの始点と終点には、反対方向を向いた2つの制御線があることがわかります。閉じた連続パスの場合、始点と終点の両方の制御線は同じ角度 (鏡像方向) で、もちろん同じ長さである必要があります。これは、間違いやすいので覚えておくことが重要です。カーブに沿った他のすべての点には、カーブが描画される方向と反対の方向を指す単一の制御点/線のみがあります。その線分が長いほど、その制御点でのカーブの「シャープさ」は少なくなり、長さがゼロになると「点」が生成されます。'
ただし、'
この場合、円弧はそれほど均一ではなく、帆というよりは逆さまのサメのヒレのようなものが得られます。2次円弧は放物線であり、楕円弧は基本的に円形セグメントを生成することを覚えておいてください。これは、使用する円弧セグメントの種類を決定するための鍵となる可能性があります。このパス関数の詳細については、SVG: 2次ベジェカーブコマンド を参照してください。
画像の上部でY軸が負のままで、下部で正のままですが、描画領域の '
"
"
そして最後に、"
これらの演算子には、一般的に使用されるMVG "
画像を反転...
原点を中心に30度回転...
より複雑なアフィン変換については、その目的のために作成された アフィンヘルパースクリプト を利用できます。これらのスクリプトは、回転角度や中心点などのものを、"
ただし、描画変換 を使用することで、楕円に「回転角度」を簡単に追加できます。
楕円の「中心」(回転の中心点)は、回転が適用される前にまず移動(translate)されたことに注意してください。その後、「
建設中
それだけでなく、ImageMagickは「MVG:」画像ファイル形式を直接読み込むことも理解しており、このようなコマンドをより直接的に描画できます。ただし、MVGファイルでキャンバスが定義されていない場合は、描画する初期キャンバス("-size"および"-background")を指定する必要がある場合があります。
MVGファイルに「
建設中
建設中
上記では、「
生成する描画文字列はかなり長くなる可能性があり、最終的なコマンドの長さで問題が発生し始める可能性があります。したがって、点を長い文字列に変換してコマンドラインでIMに渡すのではなく、代わりに描画コマンドをファイルとしてIMにパイプすることができます。また、今回は描画プリミティブ描画メソッドの代わりにSVGパス描画メソッドを使用しています。また、生成するシンボルは各点の周りの三角形です。
SVGパスは、相対ピクセル移動を可能にすることでこれを実際にはより簡単にしており、シンボルを設計することで、シンボルを描画するための一連の「移動」と「線」を与える前に、単一の初期絶対移動「
これで、さらに一歩進んで、描画キャンバスの指定を含む、完全に形成されたMVGファイルを、描画コマンドのパイプラインとして直接IMにフィードできます。今回は、多くの計算が必要だった上記の最初の「プラス」の例に似た「クロス」を作成しましょう。
これは、シェル括弧内で「エコー」されるものすべてが、MVGファイルとして最終的な「
より大きな背景に画像を合成する例は、「画像のレイヤー化」のセクションで説明されています。ただし、「レイヤー化された画像のプログラムによる配置」で説明されているようなループ処理の方が役立つ場合があります。将来:座標を使用した画像のレイヤー化の例
その後、アルファシェイプオペレーターを使用して、結果を直接カラーオーバーレイに変換できます。これの大きな利点は、各シンボルの個々の場所を実際に知る必要がないことです。または、シンボルがいくつあるかも。しかし、それは欠点になる可能性もあります。主な欠点は、位置が整数位置でのみ指定されることです。浮動小数点「サブピクセル」の位置を使用して「描画」することはできません。
このために、私が作成した特別なスクリプト「
これにより、「
小さな画像のみを使用する必要があり、シンボルが重ならないようにピクセルポイントを十分に広げて配置する必要があります。これは、畳み込みが重なり合う領域を合計して、予想よりも明るくするためです。上記は、使いやすくするためにUNIXシェルスクリプト「
このテクニックは、IMフォーラムIMの楽しい経験での議論から生まれました。ユーザーは、サッカー場の背景画像に小さな人を配置して、その位置が写真の中に人の名前を綴るようにしたいと考えていました。
Fred Weinhausは、変換を使用することで円のエッジ座標を計算する必要がなくなり、半径を直接指定するだけで済むことに気が付きました。
ただし、複数の円を描画する場合、上記では各円に個別の「
また、「
残念ながら、このテクニックでは生成された円をアウトライン化することはできませんが、広い領域をカバーするには、大きなストローク幅が役立つ場合があります。下の「いくつかの簡単な例」を参照してください。この方法では、SVGパス描画メソッドを使用しているため、追加の座標を計算する必要なく円を描画できます。
中心を定義するために必要なのは、最初の絶対移動「
Fred Weinhaus は、以下のベジェ円メソッドを追加しました。これは実際の円に非常に近いものですが(正確ではありません)、浮動小数点演算が必要です。
正確な円を描画することが重要でない場合は、円の X および Y 境界のみを計算に使用する、この 4 つのベジェセグメント SVG パスを使用できます。
中心開始点に対して完全に相対的に描画されるものが好ましい場合は、この手法を使用できます。半径の値のみが使用されるため、API で文字列関数のみを使用して簡単に生成できます。
円を描画する他の方法を考えられますか?
シンボルの開始点が線のまさに終点になるように描画したことに注意してください。これにより、前に描画した線の上に後退して描画できるため、非常に見栄えの良いシンボルになります。ただし、矢印には方向が関連付けられています。さまざまな角度で多数の矢印定義を作成できます。多くのプログラムがこれを行います。しかし、矢印はベクトルなので、ベクトルとして矢印を回転させてみませんか。IM の draw コマンドには、描画回転 (キャンバスワーピング) が組み込まれているため、それを使用しましょう。これには、矢印ヘッドの '
矢印のサイズを変更する場合は、回転後に「スケール」描画オプションを追加します。
矢印の「先端」を指定した位置に残したまま拡大した方法に注意してください。これは矢印を処理する上で非常に重要な側面です。矢印を追加する線の終点と角度のみが重要だからです。「変換」の順序は重要であり、実際に実行される順序とは逆になります。つまり、座標に最初にスケールが適用され、次に回転、そして変換が適用されます。座標変換がその順序で行われなかった場合、矢印の最終的な配置もスケーリングすることになり、期待どおりの位置にはなりません。また、スケールには 2 つの数値があり、元の矢印ヘッドシンボルは水平 (角度ゼロ) に設計されているため、矢印の幅を高さとは別にスケーリングできます。また、ストローク幅も矢印ヘッドのサイズに合わせてスケーリングされ、一貫性が保たれていることに注意してください。
キャンバスをワーピングして個々の矢印を描画する場合は、他の多くの描画操作とともに、それらをすべて 1 つの「
'
または、道化師のやや複雑な笑顔を生成することもできます。
何を思いつくことができますか? お知らせください。
最初の塗りつぶしの色をグラデーションシェードに置き換えることによって (インメモリタイリング技術を使用)、円柱を少し 3D のように見せることができます...
(IM フォーラムで議論されたように) 円柱の描画を徐々に洗練することにより、非常に複雑で視覚的に魅力的な円柱を生成するのに非常に大きな進歩を遂げることができます。これには、半透明のガラス円柱、影効果、およびラベルの追加が含まれます。その議論の最終的な結果は、円柱のパーセントバーを生成するスクリプト「
最初の画像は、私が使用した「
パーセント「エスケープ」(および「
「パーセントバグ」の詳細と、古いImageMagickで「
ダブルクォートの場合は...
ただし、「
ただし、ファイルから注釈文字列を読み込む場合、すべてのエスケープは完全に無視されます。
詳細については、「注釈テキスト描画演算子」および特に「注釈エスケープ文字」を参照してください。
完璧です。適切な対角グラデーションが生成されます。
ご覧のとおり、内部MSVG変換は失敗し、対角線ではなく垂直グラデーションを返します。SVGを直接MVGファイルに変換することで、IMが生成する実際のMVGコマンドも確認できます。MSVGコンバーターがSVGをMVG描画コマンドに変換しようとした方法がわかるでしょう。現在の内部MSVGで失敗することがわかっていることには、以下が含まれます...
上記の例のより大きな透明な背景バージョンにはPNG形式の画像を使用したことに注意してください。これにより、半透明のエッジピクセルにより、GIF画像形式よりもクリーンな画像が生成されます。最終的な画像に透明度が関係する場合は、常にPNGをお勧めします。
ただし、これが機能するためには、'開発版' の "
もちろん、これは "
これはもちろん完全なリストではありません。OpenOffice、Word、TeXなどの多くのワードプロセッサでさえ、一般的にさまざまなシンプルですが、多くの場合使用が難しいオブジェクトエディターを備えています。ただし、ベクターグラフィック形式を別のベクター形式に変換する場合は、ImageMagickを使用しないでください。ImageMagickは、基本的にラスター画像またはビットマップグラフィックのコンバーターおよびマニピュレーターであり、常にそうあり続けます。詳細については、ベクター画像形式に関する注意を参照してください。
![]() |
|
-draw
」演算子のその他のより一般的な側面について説明します。draw コマンドは、単純な画像を作成する手段として始まりました。しかし、時が経つにつれて、ベクターグラフィックからラスター画像への変換のインターフェースとなるように拡張されてきました。ImageMagick Draw コマンド
コンピュータの画像は一般的に 2 つの異なる方法で保存されます。これらの例のページ全体で見てきた最初で最も一般的な方法は、ラスターグラフィックスとして知られています。このアプローチでは、画像はピクセルの長方形配列で保存されます。もう 1 つの方法はあまり一般的ではなく、変更も少ないですが、別の意味ではより汎用性の高い、オブジェクトベクターグラフィックスです。この形式では、画像は線、円弧、塗りつぶし、場合によっては奥行きで記述されます。この形式は、画像をほぼ任意サイズに拡大縮小しても完全に表示されるため、便利です。また、ラスター形式の同等のものと比較して、非常に大きな複雑な画像を非常に小さなスペースで記述することもできます。ベクターグラフィック画像の例には、PostScript や新しいSVG -- Scalable Vector Graphicsがあります。True-Type フォントもベクターグラフィックの例であり、これにより、個々の文字の説明を任意のスケールで使用できます。「-draw
」画像演算子は、ImageMagick ベクター描画機能への窓口であり、IM の通常のコマンドライン画像演算子とはまったく別のコマンドセットを形成します。![]() ![]() |
すべての形式が通常他の形式とは大きく異なるため、一般的に使用されるベクターグラフィックファイル形式はごくわずかです。その結果、コードの共有はほとんど不可能です。 このため、ImageMagick は、SVG 形式の画像を描画するためのベクターグラフィックの使用により関心を持っています。PostScript および True-Type フォントグラフィックは、これらの種類のベクターグラフィック形式の描画に適した他の外部「delegate」ライブラリおよびアプリケーションに渡されます。 つまり、デリゲートが SVG で利用できないということではありません。1 つの例として、コンパイル時に利用可能な RSVG ライブラリまたは GTK SVG ライブラリがあります。IM は、それ自体で SVG を処理しようとするのではなく、これらのライブラリにリンクして SVG を処理します。 |
プリミティブな描画コマンド
MVG コマンドの「-draw
」画像演算子の最も古く、最もシンプルで、最も一般的な描画プリミティブから始めましょう。すべての引数は浮動小数点として扱われ、これらの例で私が通常使用するような整数である必要はないことに注意してください。色塗りプリミティブを参照してください。
|
![]() ![]() ![]() ![]() |
arc
」描画プリミティブは、2 つの座標で定義された「rectangle
」の内側に収まる「楕円」にすぎないため、長方形と共にリストされています。角度が 90 度の倍数に制限されていない限り、部分的な円弧の終点を決定するのは難しいため、部分的な円弧はめったに使用されません。「
circle
」および「ellipse
」プリミティブには、「エッジ」座標、または「サイズ」および「角度」の値を持つ「中心」座標が含まれます。
|
![]() ![]() ![]() |
|
![]() ![]() ![]() ![]() |
|
![]() ![]() |
-gravity
」の影響を受ける唯一の描画操作です。これらの操作のその他の修飾子には、「-fill
」、「-tile
」、「-origin
」、「-stroke
」、「-strokewidth
」、「-font
」、「-pointsize
」、「-box
」などがあります。その他の修飾子もありますが、これらはより高度なMagick ベクターグラフィックス言語に関連しています。ベジェプリミティブ
「bezier
」プリミティブは、曲線を描画するために使用されます。各コマンドは、1 つの曲線セグメントのみを描画します。通常、4 つの点(8 つの数値)が与えられます。開始点「結び目」、2 つの制御点、および終了点「結び目」です。2 つの制御点は、方向と曲線が接続された終点「結び目」点から逸脱する速さを定義します。2 つの曲線を滑らかに結合するには、終点からの制御点を「結び目」を通して鏡面反射して、次のベジェ曲線の制御点を形成する必要があります。たとえば、ここでは、滑らかに結合する 2 つのベジェ曲線を描画します。制御線と点(これも描画される)が、角度と長さの両方で、結合座標をまっすぐに通過するように鏡像になっていることに注意してください。これは重要です。そうしないと、曲線が滑らかになりません。
|
![]() |
|
![]() |
|
![]() |
|
![]() |
bezier
」プリミティブは、4 つのすべての点を指定しないと、実際には役に立ちません。最初と最後の点のみが、曲線が通過する(または終了する)「結び目」として分類されます。他のすべての中間点は、純粋に制御点と見なされ、与えられた順序で曲線に影響を与えます。制御点が離れるほど、曲線のそのセグメントへの影響が大きくなります。
|
![]() |
bezier
」曲線セグメントごとに 4 つ以上の点を使用しないことをお勧めします。実際には、「bezier
」プリミティブをまったく使用せず、代わりにSVG パス三次ベジェを使用して曲線を生成することをお勧めします。これには、滑らかに結合する曲線セグメントを生成するために適切な制御点「反射」を自動的に行い、使用する必要のある制御点の数を減らす特別な「S
」曲線継続関数があります。パス内の最後の終点を基準にして点を定義することもできます。色塗りプリミティブ
上記の「単純な」プリミティブに加えて、「-draw
」は、一連の色塗りつぶしまたは修正プリミティブも提供します。これらは、選択した方法に従って、指定された点から始まる画像の色を変更します。これらの塗りつぶし方法は、実際には真の「描画」コマンドではなく、色置換関数です。これらは、プログラムの非常に初期のバージョンで、ImageMagick に操作を挿入する最も簡単な場所だったので、描画に追加されました。上記と同様に、使用される色は「-fill
」の色設定で設定されますが、設定されている場合は、「-tile
」画像が代わりに使用されます。上記の他の設定オプションは使用されず、これらの操作には影響しません。これらのプリミティブにも適用する 2 つの追加設定、「-bordercolor
」および「-fuzz
」ファクター設定があります。ただし、これらの設定は「MVG」言語内で定義できないため、「-draw
」演算子を使用する前にのみ設定できます。これらの最初の「color point
」は、上記の例の「point
」描画プリミティブの代替として既に確認しました。注意深く見ると、テスト画像で設定した単一の白いピクセルが表示されます。
|
![]() |
point
」関数を使用して、半透明の青色で赤色のピクセルを塗りつぶし、紫色の結果が得られました。ただし、「color point
」関数(最後の右のピクセル)を使用する場合、赤色は半透明の青色のピクセルによって完全に置き換えられます。重ね合わせられません。
|
![]() |
color
」関数は完全な色置換を実行しますが、他のすべての色プリミティブは画像の上に色を「描画」します。そのため、透明色を描画するために「color
」を使用できます。「color replace
」描画関数は、指定された場所にある正確に指定された色のすべてのインスタンスを置き換えます。また、わかるように、領域は接続されている必要はありません。
|
![]() ![]() ![]() |
-opaque
」画像演算子を使用できます。この関数も、「-fuzz
」係数設定を使用して、指定された色に一致する色の範囲を広げます。「floodfill
」メソッドも非常にシンプルで、選択したポイントの周囲の領域全体を塗りつぶすだけで、何らかの方法で接続されていない類似色の他の領域は選択しません。また、同様の色を含めるために「-fuzz
」を使用して、塗りつぶされる領域を拡張することもできます。この場合、クロスボーダーも含めるのに十分な高い値を選択したため、塗りつぶしが画像の反対側に「漏れる」ことができます。
|
![]() ![]() ![]() |
filltoborder
」は「floodfill
」に似ていますが、塗りつぶしプロセスで置き換えられる色ではなく、塗りつぶす領域の境界となる色を指定するという点が異なります。もちろん、ファジー係数も、その境界色の選択に「類似色」を含めるために推奨されており、塗りつぶしをさらに制限します。
|
![]() ![]() ![]() |
reset
」です。これは、画像全体を塗りつぶし色で置き換えたり、リセットしたりするだけです。この場合、実際に選択したピクセルは結果に全く影響しません。
|
![]() |
-tile
」パターンを使用して領域を塗りつぶす。アルファ塗りプリミティブ
「alpha
」描画プリミティブは、上で説明した「color
」プリミティブと全く同じように機能しますが、選択した領域の色は置き換えられず、選択した領域の「アルファ」チャネルのみが置き換えられます。(つまり、「アルファ」チャネルのみがこれらの塗りつぶし関数によって調整されます)。「color
」塗りつぶし関数と同様に、「アルファ」値は塗りつぶし色を使用します(使用する「アルファ値」のソースとして「-tile
」を使用する場合を除く)。ここでは、上記の同じ「color floodfill
」の例を使用しますが、塗りつぶされた部分を完全に透明にするためにアルファチャネルのみを調整します。つまり、元の色はまだ存在しますが、透明になっています!
|
![]() ![]() ![]() |
alpha reset
」関数を使用して、画像全体を半透明にすることもできます。もちろん、この場合、画像に半透明の色を受け入れることができるPNGに出力する必要があります。
|
![]() |
black
」色のコンポーネントは操作で使用されておらず、色のアルファコンポーネントのみが使用されていたことに注意してください。画像の元の色はそのまま残されます。将来の課題:興味深いアルファ効果のために「-tile
」パターンを使用する。「color
」と「alpha
」の両方は、色の完全な置換機能であり、常にブール値(すべてまたは何もなし)のタイプの色の置換を生成します。そのため、そのような領域のエッジには常にエイリアシング効果が表示されます。このため、これらは一般的に、GIF画像の透明な領域を設定する場合(これもブール値です)を除いて、一般的な画像開発には適した画像演算子ではありません。ただし、背景の削除の例でわかるように、すべてが失われたわけではありません。描画コマンドに関する詳細
ピクセル座標
「-draw
」コマンド(およびIMの他の多くのコマンド)は、「ピクセル座標」と呼ばれるものを使用します。つまり、「10,10
」の座標は、左上隅から下と左に10ピクセル移動したピクセルの中心です。この座標系では、0,0は左上のピクセルの中心であり、w-1,h-1は右下の隅の中心です。実際のエッジは-0.5,-0.5およびw-0.5,h-0.5にあり、中央のピクセル(画像が奇数サイズの場合)は「(w-1)/2,(h-1)/2
」にあります。ただし、歪みを使用する場合など、画像を数学的に処理している場合、実際のピクセルには実際には意味がなく、そのため「画像座標」を使用します。このシステムでは、画像の実際のエッジは「0,0
」および「w,h
」にあります。そして、画像の中央(ピクセルの中央である場合もそうでない場合もあります)は「w/2,h/2
」にあります。「ピクセル座標」を画像座標に変換するには、½を追加します。したがって、左上のピクセルの中心は「0.5,0.5
」であり、右下のピクセルは「w-0.5,h-0.5
」です。例:小さい画像内の円の中心ガンマとカラースペース補正を用いた描画
ほぼすべてのImageMagick操作と同様に、「-draw
」は線形演算子です。したがって、線形RGBカラースペースで機能します。つまり、滑らかなエッジを得るには、画像を保存する前にガンマ補正を行い、非線形(ガンマ補正済み)のsRGBカラースペースを使用して保存する必要があります。たとえば、大きな円を描いて保存するだけの場合...
|
![]() |
これを修正するには、保存する前に画像にガンマ補正を追加する必要があります。
|
![]() |
|
![]() |
![]() ![]() |
(画像を保存する正しい方法である)sRGBカラースペースは、単純に2.2ガンマ補正を適用するのとまったく同じではないことに注意してください。ただし、2つの結果の違いはわずかであり、非常に暗い画像でのみ確認できます。 |
![]() ![]() |
IM v6.7.5-1より前では、カラースペース名「sRGB」と「RGB」(線形RGB)が実際に逆になっていました。そのため、IMの古いバージョンでは、上記の2つのラベルを入れ替える必要があります。 |
|
![]() |
|
![]() |
|
![]() |
![]() ![]() |
上記の線は、「-stroke 」色を使用して描画されました。「-fill 」を使用して線を描画して同じ結果を得ることができますが、その場合は「-strokewidth 」を使用して線の太さを制御することはできません。詳細については、以下のストローク色の設定を参照してください。 |
![]() ![]() |
カラー名は実際には「sRGB」カラースペースの値を使用して定義されていますが、描画によって画像が線形RGBカラースペースであるかのように適用されています。そのため、名前付きの色(「白」または「黒」以外)で上記のガンマ補正を使用すると、それらの色が歪んでしまいます。このような場合、名前付きの色が正しくマッピングされるように、ガンマ補正またはカラースペース補正を使用しない方が良い場合があります。 名前付きの「sRGB」色の、描画先の画像のカラースペースへの正しいマッピングは、IMv7開発の一部として修正されます。 |
ストローク、ストローク幅、塗りつぶしの相互作用
「-stroke
」および「-strokewidth
」オプションは、フォントのエッジの周りにアウトラインを描画するときに使用されます。これらのオプションは、「-fill
」と組み合わせて、テキストをより面白くするために一般的に使用されます。労力はほとんどかかりません。
magick -size 380x70 xc:lightblue -pointsize 50 -font Chisel \ -fill green -stroke black -draw 'text 10,55 "Black Border"' \ stroke_font.jpg |
![[IM Output]](stroke_font.jpg)
-strokewidth 1
」および「-stroke None
」です。しかし、これによりアウトラインストロークが見えなくなり、「-fill
」の色だけが残ります。表示されません。「-stroke
」が「非表示」の場合、「-strokewidth
」が持つ唯一の効果は、フォントサイズ属性に関するものです。つまり、フォントの位置とラベルおよびキャプション画像生成のサイズに影響を与える可能性があります。それ以外の場合、ストロークを表示可能にするまで、幅に目に見える効果はありません。「-strokewidth
」が(表示可能になったときに)フォントの外観に実際にどのように影響するかを見るために、ここでは、さまざまな幅でテキストを描画しました。「オフ」から始まり、徐々に大きくなっています。
magick -size 320x420 xc:lightblue -pointsize 70 -font Vademecum \ -fill red -stroke none -draw 'text 30,80 "Stroke -"' \ -fill red -stroke black -strokewidth 0 -draw 'text 30,160 "Stroke 0"' \ -fill red -stroke black -strokewidth 1 -draw 'text 30,240 "Stroke 1"' \ -fill red -stroke black -strokewidth 2 -draw 'text 30,320 "Stroke 2"' \ -fill red -stroke black -strokewidth 3 -draw 'text 30,400 "Stroke 3"' \ stroke_table.jpg |
![[IM Output]](stroke_table.jpg)
-strokewidth
」を「0
」に設定することは、「-stroke
」の色を「none
」(デフォルト)に設定することと同じではないことに注意してください。前者は非常に細いストロークアウトラインを作成し、後者は実質的にオフにします。どちらの場合も、ストロークは描画されます。ただし、「-strokewidth
」を「0
」に設定した場合でも、画像の輪郭は、単純な「塗りつぶし」画像(「-stroke
」色が「none
」の場合)よりもごくわずかに拡大されることにも注意する必要があります。基本的に、「1.0
」よりも小さい幅を使用すると、正しく機能しません。そして、これが問題になる可能性のある場合は注意する必要があります。ただし、「-strokewidth
」も浮動小数点設定であることに注意してください。つまり、「0.5
」のストローク幅も有効です。ただし、通常、これは薄いビットマップ円を描画しようとするときに、アンチエイリアシングをオフにした場合にのみ重要です。非常に大きなストローク幅を使用する例を次に示します。
magick -size 320x100 xc:lightblue -font Candice -pointsize 72 -fill white \ -stroke black -strokewidth 15 -draw "text 25,65 'Anthony'" \ stroke_thick.jpg |
![[IM Output]](stroke_thick.jpg)
-strokewidth
」は内側と外側の両方の線を拡大することに注意してください。同じ例ですが、フォントをストロークアウトラインなしで再描画して、非常に太いストロークの内側の部分を削除しました。
magick -size 320x100 xc:lightblue -font Candice -pointsize 72 -fill white \ -stroke black -strokewidth 15 -draw "text 25,65 'Anthony'" \ -stroke none -draw "text 25,65 'Anthony'" \ stroke_outline.jpg |
![[IM Output]](stroke_outline.jpg)
線(ストローク)の描画
IMでのデフォルトの線描画には、知っておく価値のある奇妙な動作がいくつかあります。以下はデフォルトの線描画です...
|
![]() |
-fill
"オプションで設定できます。
|
![]() |
-stroke
"の色を設定することで、線をわずかに太くすることができます。
|
![]() |
-fill
"オプションで指定した白色はどうなったのでしょうか? これは、ImageMagickで線を描画する際の厄介な点です。プログラムが実際に行っているのは、線を幅約1ピクセルの塗りつぶされたオブジェクトとして扱うことです。これは、通常、複数の線を使って塗りつぶされる領域を掃くことが一般的であるため、自然なことです。そのため、前のセクションでフォントでストロークを使用したときと同様に、IMは塗りつぶしの色を使って線(またはオブジェクト)を描画し、その周りをストロークの色で描画します。その結果、上記のストローク色の線はわずかに太くなり、塗りつぶしの色は完全に下側に隠れてしまいます。ストローク色を半透明にすると、塗りつぶしの色を再び表示できます。要約すると、線は"-fill
"の色で描画されるように見えますが、"-stroke
"の色がデフォルトの"none
"または"transparent
"以外の色に定義されると、そのオプションは意味をなさなくなります。![]() ![]() |
オプション"-linewidth "は、実際には"-strokewidth "のエイリアスに過ぎず、使用すべきではありません。 |
-stroke
"の色が見えないため、見ることができません。見えるのは、1ピクセル幅の線の内側の'塗りつぶし'のみです。
|
![]() |
![]() ![]() |
上記の結果は、実際にはバグだと考えています。塗りつぶされるべき「領域」がなく、「線のストローク色」も設定されていないため、何も描画されるべきではありませんでした。IMが現在これを行っている理由は、新規ユーザーの混乱を避けるためですが、実際には上級ユーザーに問題を引き起こすだけです。詳細については、描画塗りつぶし境界を参照してください。 |
|
![]() |
-strokewidth
"設定が1に設定されている場合、上記の線は完全に覆われます。
|
![]() |
|
![]() |
-strokewidth
"設定である'0
'を使用しました。
|
![]() |
|
![]() |
![]() ![]() |
「色のビート周波数」効果は、わずかにチューニングがずれている2つのギターがある場合に得られる「サウンドビート」に似ています。この場合、ストローク色が下の塗りつぶし色を完全に上書きする黒い点と、ストローク色が塗りつぶしと背景色の両方と混ざり合う灰色の点が得られます。
色の混合は、IMが線やその他の描画オブジェクトの見栄えを改善するために使用するアンチエイリアシングプロセスの自然な結果です。詳細については、私のIMのアンチエイリアシングの議論と例のページを参照してください。 |
|
![]() |
|
![]() |
|
|
![]() |
|
|
![]() |
|
ストロークがnoneの場合と比較してみましょう...
|
![]() |
![]() ![]() |
これらの結果は、色のビートを引き起こすバグのあるストローク幅0だけでなく、塗りつぶされる実際の領域がない場合に、追加の直径1.0の太さで描画される「塗りつぶし色」によっても引き起こされます。これもバグだと考えています。描画塗りつぶし境界を参照してください。 |
描画塗りつぶし境界
さまざまな描画プリミティブについて注意すべき点がいくつかあります。ストローク幅は1.0を超える浮動小数点値ではうまく機能しますが、1.0未満の値では機能が停止するようです。これは使用されている実装アルゴリズムが原因であり、単に間違っているからではありません。より太い線では正常に機能するためです。基本的にストローク幅を0にすると、ストローク色が追加されないと予想される可能性があります。代わりに、線がピクセルの実際の「中心」を通過するときに、ストローク色が最大の強度になる一種のビートパターンが得られます。実際に起こるべきことは、ピクセルに追加される色の量は、描画される線の面積を反映するべきであり、その線からのピクセルの距離を反映するべきではありません。そのため、幅がゼロの線は画像に色を追加するべきではなく、厚さが1.0未満の線はより少ない量の色のみを追加するべきです。上記のストローク幅とストロークを使用した線の描画の例を参照してください。もう1つの問題は、塗りつぶし色が描画される図形(ポリゴン)の端までではなく、½ピクセルさらに外側に適用されていることです。これには、「ストローク」が適用されておらず、エッジが正確であるべき状況も含まれます。また、「線」を描画することも含まれます。「線」には、実際には「ゼロ」の塗りつぶしの厚さがあります。基本的にストロークを有効にせずに線を描画すると、技術的には「塗りつぶし」の厚さがないため、線は表示されないはずです。代わりに、線は少なくとも1ピクセル幅の「塗りつぶし」色を含めて描画されています。これは歴史的な理由によるものであり、通常、IMの新規ユーザーの混乱を避けることができます。残念ながら、上級ユーザーにとっては正しくありません。つまり、塗りつぶし色のみを使用して2つのポリゴンを描画し、端を共有する場合、各ポリゴンがすべての端に沿って½ピクセル大きいため、その端は1ピクセル重なります。言い換えれば、ポリゴンやその他の図形は互いに適合せず、重なり合います。たとえば、ここでは描画を使用して画像を2つの半分に分割しようとしています(白地に黒で描画)。これを行うために、重複せずに完全に端を共有する2つのポリゴンを描画します。結果として得られる「小さな」画像は、表示のために拡大されています。
magick -size 10x10 xc: -draw 'polygon 2,-1 7,10 10,10 10,-1' bound_left.gif magick -size 10x10 xc: -draw 'polygon 2,-1 7,10 -1,10 -1,-1' bound_right.gif magick bound_left.gif bound_right.gif -compose Plus -composite bound_add.gif |
![[IM Output]](bound_left_mag.gif)

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

![[IM Output]](bound_add_mag.gif)
-strokewidth 1.0
"設定と同等です。そのため、通常、この追加の領域は通常のストローク幅で覆われると予想されます。ただし、いくつかの実際的な問題を引き起こす可能性があります。余談:結合の完全なテストを行うには、黒い背景に50%グレーの領域を生成し、それらを一緒に加えます。そうすることで、領域が(上記のように)「重なり合う」だけでなく、領域を一緒に加えたときに「下重なり合う」(塗りつぶされた領域の間にギャップを残す)かどうかもテストできます。結果の画像は、結合に沿って色の変動がない、完全に滑らかな50%グレーの色にする必要があります。透明度のチェックでは、完全に透明な背景に50%透明、50%グレーの色を使用する必要があります。単一のマスク画像に基づく、完全なカットと再追加の例については、合成方法の例であるCompose DstOutを参照してください。今後のバグ修正:塗りつぶされる領域は正確である必要がありますが、図形を描画するときにこれを補正するために、デフォルトの「ストローク色」は塗りつぶし色に設定する必要があります(それ自体が具体的に設定されていない限り)。MVG - Magickベクターグラフィックス
上記に示したプリミティブは、提供されているすべての"-draw
"操作の基礎を形成します。それらは一緒に、ImageMagickの内部で、Magickベクターグラフィックス言語と呼ばれる特別な言語の開始点です。この言語の詳細については、IM WebサイトのMVGプリミティブと構文の概要を参照してください。この「MVG」言語は、ImageMagickがさらに複雑なSVG(Scalable Vector Graphics)言語を処理できるようにすることを目的として設計されました。SVG形式で与えられた画像をより単純な内部MVG形式に魔法のように変換しようとすることで、これを行います。詳細については、下のSVGの処理を参照してください。したがって、上で見たものは、"-draw
"演算子の機能のほんの一部にすぎません。ただし、複雑なオブジェクトを描画する場合は、「Sodipodi
」などのSVGエディターを使用して、オブジェクトの別のSVG形式の画像を作成することをお勧めします。(下の非IMベクターグラフィックプログラムを参照してください)。SVGとは異なり、MVGには「コンテナ」または一連の画像コマンドの形式はありません。これらはすべて、MVG描画コマンドの簡略化されたシーケンスを生成するための変換プロセス中に削除されます。代わりに、グラフィックコンテキストの概念を使用して、さまざまな描画設定を保存および復元します。これについては、これから見ていきます。コマンドライン設定と MVG 設定の比較
まず、描画プリミティブが使用するコマンドラインオプションを介して設定するほとんどすべての設定には、MVG描画コマンドに直接相当するものがあります。コマンドラインオプション("-strokewidth"など)を介して設定するか、MVG描画文字列(たとえば'stroke-width
')内で設定を使用するかの主な違いは、MVG設定がMVGコマンド文字列の期間のみ継続することです。Summary of the General Drawing Settings __cmd_option__ __draw_MVG__ __Argument__ -fill fill color/tile for inside shapes -tile fill image tile, replaces fill color -stroke stroke line color/tile around the shapes -strokewidth stroke-width pixel width +antialias stroke-antialias 0/1 aliasing line edges -font font font_name / font_file -family font-family ? -weight ? ? -stretch ? ? -pointsize font-size height in points -kerning - extra inter-character spacing +antialias text-antialias 0/1 aliasing drawing text -box text-undercolor fill color for font bounding box - decorate (None, Underline, LineThrough or Overline) -gravity gravity (None, North, South-East,...) -fuzz - color delta / percentage -bordercolor - color Notes: - no such option ? unknownこれらの設定は、上記で定期的に使用および実証されているため、通常はよく理解されています。
![]() ![]() |
フォント、ストレッチ、スタイル、およびウェイトは、ImageMagickフォントリストからフォントを識別するために使用されます。ただし、ほとんどの人は、代わりに特定のフォントとポイントサイズを選択して使用するだけです。そのため、IMではめったに使用されません。 |
-draw
」演算子を使用する前に、コマンドラインから指定する必要があります。MVG の一部の設定は、フォント描画の 'decorate
' 設定のように、グローバルなコマンドライン設定として使用する方がおそらく便利でしょう。警告:「-gravity」は SVG 仕様の一部ではありません。MVG 内では、テキストと画像の配置、および位置揃えにのみ使用されます。現在、デフォルトの「重力」効果とは別の位置揃えの設定はありません。ただし、位置揃えは SVG テキスト処理の一部であるため、将来変更される可能性があります。さて、グローバルなコマンドライン設定(MVG 描画文字列の外)は、適用する各「-draw」操作の設定を初期化するために使用されます。これが、「-fill」色を設定して、その色の円を描画できる理由です。
|
![]() |
|
![]() |
|
![]() |
|
![]() |
MVG 固有の設定
プリミティブ操作を使用する場合でも、線やオブジェクトの描画方法を制御するその他の MVG 設定を知っておくと役立ちます。これらには以下が含まれます...__draw_MVG__ __Description/Argument__ fill-opacity fill transparency, from 0.0 to 1.0 clip-rule fill style for crossed lines (evenodd, nonzero) stroke-opacity line transparency, number from 0.0 to 1.0 stroke-dasharray list of 'on' and 'off' lengths for lines stroke-dash stroke-linecap End of line look: butt round square stroke-linejoin Lines joins: butt miter round square stroke-miterlimit Angle when 'miter' joins become 'bevel' (or 'butt')すべての MVG 設定と描画演算子の完全なリストは、IM ウェブサイトのMVG プリミティブと構文の概要で確認できることを覚えておいてください。いくつかのより単純な設定の効果を見てみましょう...
|
![]() |
|
![]() |
||
|
![]() |
|
![]() |
||
|
![]() |
|
![]() |
||
![]() |
stroke-miterlimit
' 設定は、実演するのがやや難しいです。このプロパティは、'miter
' ジョイントが 'bevel
' ジョイントに変更される角度を定義します。基本的に、非常に鋭い角度の場合、マイターは 2 本の線の実際のジョイントから大きく伸びる可能性があります。これは、その鋭さに最大制限を設定し、長くなりすぎるとコーナーポイントを鈍化させます。ただし、これは何らかの角度の三角法的な値を表しており、長さや距離ではありません。値は 1.0 より大きい必要があります。上記は、私が表示している結合角度の場合、マイターが値 6 から 7 の間のどこかで突然ベベルに変わることを示しています。たとえば、'stroke-miterlimit
' が 1.414 の場合、90 度未満の任意の角度で 'miter
' が 'bevel
' に変換されます。値が 4.0 (デフォルト) の場合、約 29 度未満の角度のジョイントが変換されます。一方、10.0 の値では、約 11.5 度未満の角度で変換されます。 SVG パスの描画
SVG パスは、SVG の基本的な描画プリミティブです。線、形状、円、曲線、弧などを描画するために使用されます。SVG パスの完全な仕様は、SVG パス仕様ドキュメントに記載されています。ただし、これはユーザー向けではなく、プログラマー向けであるため、読みやすいドキュメントではありません。そのため、パス仕様を簡略化して要約します...- 文字はコマンドであり、すべての数値(浮動小数点)は引数です。
- コンマまたはスペースを引数の区切り文字として使用できます。それ以外の場合は完全に無視されます。
- 各パスコンポーネントの最後の 2 つの引数 (x,y) は、そのパスコンポーネントの終点 (または「ノット」) になります。
- 大文字は、最終点の絶対座標を指定します。
小文字は、前のコンポーネントの終点に対する相対座標です。
例: "M 1,2 l 3,4 l 2,-4
" は、"M 1,2 L 4,6 L 6,2
" と同じです。
つまり、3,4 が 1,2 に追加され、4,6 への線が描画されました。
次に、2,-4 が追加され、最終座標 6,2 への線が描画されました。 - 各要素の引数は、同じパス文字を再発行せずに、数値引数グループを追加することで繰り返すことができます。ただし、曲線の場合、読みやすくするために、関数文字を追加することをお勧めします。
- "
M
" または "m
" の繰り返される引数は、それぞれ "L
" または "l
" として扱われます。
例: "M 1,2 3,4 5,6
" は、"M 1,2 L 3,4 L 5,6
" と同じです。
そして、"m 1,2 3,4 2,-4
" は、"m 1,2 l 3,4 l 2,-4
" と同じです。 - 3 次ベジェ曲線の場合、すべてのポイント (制御ポイントと終点ノットポイント) は、前のパスコンポーネントの終点に対する相対的な位置で与えられます。
|
![]() ![]() ![]() |
Z
' はループを閉じるだけであることに注意してください。別のオブジェクトを作成するわけではありません。そのため、2 つの「閉じられた」パスは、重なり合っているか、完全に接続が切れているかにかかわらず、単一の描画オブジェクトとして分類されます。 ここでは、同じ方向に描画された 2 つの閉じたが重なり合うループを示します。単一のパスのみが使用されているため、オブジェクトは単一のオブジェクトであり、'fill-rule
' 設定によって、重なり合う領域をどのように塗りつぶすかが制御されます。
|
![]() ![]() |
evenodd
' ルールではその領域が塗りつぶされず、非ゼロの 'nonzero
' ルールでは塗りつぶされました。ただし、すべてのパスは、実際には同じオブジェクトであるため、表示されます。パスが描画される方向は非常に重要であり、一般に、すべてのパスはオブジェクトの「内側」に対する相対方向で、まったく同じ方向に描画する必要があります。たとえば、ここでは、最初のオブジェクトとは逆方向に 2 番目のオブジェクトを描画します。そのため、2 つのオブジェクトが重なると、その領域は「ゼロ」回円で囲まれます。つまり、'fill-rule
' が何であれ、塗りつぶされず、「穴」が作成されます。
|
![]() ![]() |
|
![]() |
fill-rule
' 設定に関係なく同じです。穴は「偶数」と「ゼロ」の両方であるため、塗りつぶされません。もちろん、完全に別の 'path
' 要素を使用すると、完全に別のオブジェクトが生成されます。この場合、'fill-rule
' は適用されず、オブジェクトは指定された順序で互いに重ねて描画されます。
|
![]() |
FUTURE: coordinate aligned paths "H" and "V"楕円弧 は、SVG パスの円描画関数です...
「大きい」および「スイープ」パラメーターは、パスコンポーネントの開始点から終了点まで「弧」をどのように描画するかを 4 つの方法のうちどれにするかを決定するために使用されるため、特に重要です。
2 つのフラグ「大きい」と「スイープ」は、その半径の 4 つの弧のうち、どちらが 2 つのポイントを接続するかを定義します。
|
![]() ![]() ![]() ![]() |
|
![]() ![]() ![]() |
|
![]() |
1,1
」を使用すると、ある点から次の点に移動する完全な半円になります。この場合、楕円の角度は影響しません。
|
![]() |
|
![]() |
0,0
」の半径を持つすべての弧は、単純な直線弧になります...
|
![]() |
|
![]() |
|
![]() |
|
![]() |
L
' が円弧セグメントに置き換えられただけです。ただし、円弧のサイズは線の長さに比例する必要があります。これを行わなかったため、長い対角線は他の2つよりもはるかに強く深いカーブを持っています。オブジェクトのサイズを変更または拡大縮小するときは、線の長さと同じ量だけ半径も拡大縮小して、カーブも適切にサイズ変更し、円弧も正しく拡大縮小されるようにする必要があることを覚えておいてください。'sweep' フラグは、各パスセグメントが描画される方向に応じて、カーブが外側に膨らむか内側に膨らむかを制御します (上記参照)。
|
![]() |
|
![]() |
C
' 関数を使用して定義できます。連続したカーブのために、最後の制御点の鏡像を使用する (連続したカーブのために) 3次ベジェカーブを継続するには、'S
' 関数を使用できます。以下に例を示します。この関数の複雑さのため、制御点の位置と、最後の制御点の「仮定された鏡像」を示すキャンバスを事前に用意しました。
|
![]() |
|
![]() |
S
' 関数は、カーブのスムーズな継続を生成するために、次のセグメントのミラー制御点/線を前のセグメントのデータから内部的に生成します。このパス関数の詳細については、SVG: 3次ベジェカーブコマンド を参照してください。手動でベジェカーブを生成する のは、複雑なGUIツールを必要とせずに比較的簡単です。- まず、カーブを通るすべての座標点を定義し、リストの最後に開始座標を繰り返します。
- 次に、すべてのx、y座標点をペアに2倍にしてリストを展開し、すべてのペアの前に '
S
' (スムーズ3次) 関数を追加します。各ペアの最初の数値は、カーブ上の点を表す2番目の数値に接続された制御点です。ただし、最初のポイントペアではこれが逆になり、最初の点がカーブの開始点、2番目の点が最初で唯一の反転された制御点を表します。 - 最初の座標ペアの関数文字を '
S
' から 'M
' に変更し、この座標ペアの間に 'C
' を追加します。最後に、最初の3次 ('C
') 関数を完了するために、2番目の座標ペアから 'S
' を削除します。 - 最後に '
Z
' を追加してパスを閉じ、カーブを完成させます。
それがどのように見えるかの例のシーケンスを上記に示します。 - この時点で、パスをテスト描画できます。すべての制御線の長さがゼロになるため、パスは直線セグメントのみで構成されます。
- 必要なのは、制御線セグメント (各 '
S
' ペアの最初の座標) の位置をゆっくりと慎重に調整して、目的の最終的なカーブを取得することだけです。制御線を長すぎたり、間違った方向にしたりしないでください。そうしないと、非常に面白いカーブになります。 - 変更を確認し、間違いを見つけるのに役立つように、上記にある "
sed
" コマンドを使用して、パス制御点とカーブ制御点の間にある制御線を描画します。ただし、長さがゼロの制御線は表示されませんが、線が鋭い点を生成するため、位置は明らかである必要があります。 - 最後に、'
C
' の後の最初の制御点/線が、同じ位置にある終了制御/線と正確に反対であることを確認します。
GUIツールを使用してベジェカーブ (カーブ上の点ごとに2つまたは1つの制御点を付与) を抽出する他の方法をご存知ですか。または、そのようなカーブを生成するための他の手法はありますか? メールしてください!喜んでお話を聞きます。他の人がそうであるように、あなたもその手法でクレジットされます。2次ベジェ は、2つの制御点が1つの制御点に統合された場合の3次ベジェ関数の簡略化版です。ここでも、'
Q
' 関数でカーブを開始し、'T
' 関数を使用してカーブを継続し、最後の制御点をミラーリングできます。
|
![]() |
T
' 継続関数は、等間隔に配置された点を接続するパスでのみ実際に機能することに注意してください。私はその使用をお勧めしません。2次カーブの利点は、楕円弧の代替として、円弧に半径ではなく、実際の位置を使用することです。また、楕円弧を使用する場合に実際的ではない、ある端を別の端よりも優先して円弧を偏らせることもできます。
|
![]() |
描画サーフェスの変形
これらの機能に加えて、オブジェクトが描画される描画サーフェスをさまざまな方法で変形して、いくつかの素晴らしいことを行うことができます。まず、'translate
'、'rotate
'、'scale
'、'skewX
'、'skewY
'、および 'affine
' などの一般的な描画サーフェスの変更を適用できます。たとえば、線の「パス」が与えられた場合、描画サーフェスの原点または0,0点を別の場所に「移動」できます。
|
![]() |
0,0
' つまり原点が画像の中央に配置されていることに注意してください。「rotate
」操作では、描画サーフェスが回転するため、後でそのサーフェスに描画されるものはすべて回転して描画されます。もちろん、変換された原点を中心に回転するため、両方の変換演算子を一緒に使用することをお勧めします。
|
![]() |
scale
" は、原点を中心に描画サーフェスを拡大および縮小します。
|
![]() |
scale
" の一般的な用途の1つは、正のY値が上向きになるようにY軸を反転することです。もちろん、原点も中央または左下隅に移動して、整然とした状態を保つ必要があります。
|
![]() |
skewX
" と "skewY
" は、画像 X および Y 方向にせん断します。たとえば、ここでは "skewX
" を使用して、画像の垂直 Y 軸に傾斜を与えます。
|
![]() |
-draw
" 文字列の外に同等のものが存在します。ただし、これらのコマンドラインバージョンは演算子であり、ベクターオブジェクトがまだ描画されていない描画サーフェスにのみ適用されるのではなく、メモリに既に存在する画像にすぐに適用されます。詳細については、画像の歪み を参照してください。描画サーフェスのアフィン歪み
上記の5つのキャンバス変換はすべて、一般的なアフィン行列演算子に結合できます。MVGプリミティブ 'affine
' を使用するか、"-affine
" を設定してから、"-draw
" を呼び出すことで、アフィン変換を設定します。アフィン変換では、指定する座標を実際の描画座標にどのように変更する必要があるかを定義する一連の「行列係数」を使用します。これらの「係数」が実際にどのように機能するかの詳細については、アフィン行列変換 を参照してください。たとえば、オブジェクトが描画される基準となる中央の原点を設定するだけの場合は...
|
![]() |
|
![]() |
|
![]() |
-draw affine
" または "-affine
" 設定で直接使用できるアフィン座標に変換するマジックを行います。コンテキストのプッシュ/ポップ
一部のMVGプリミティブは、これらの変換を正しく使用するために実際に依存しています。たとえば、楕円プリミティブ は、直交に整列された軸でのみ直接指定できます。
|
![]() |
|
![]() |
ellipse
」は、移動された位置の「0,0
」に描画されました。上記では、2つの新しいMVG描画プリミティブ「push graphic-context
」と「pop graphic-context
」も示されています。これらは上記の例では厳密には必要ありませんが、主要な描画変換を行う場合は推奨されます。「push
」と「pop
」のプリミティブは、現在の描画状態または「グラフィックコンテキスト」を保存し、その後で再び復元します。この2つのプリミティブの間で変更された描画設定はすべて忘れられます。これには、「translate
」や「rotate
」などのサーフェスワーピング、および色の設定「fill
」や「stroke
」、または描画の「状態」を変更するその他のものが含まれます。これらのプリミティブを使用すると、多くの変換を含む非常に複雑なオブジェクトを簡単に描画し、後で描画操作のために、より「通常の」状況に戻すことができます。このより実際的なデモンストレーションについては、下の矢印の描画を参照してください。特殊オブジェクトのプッシュ/ポップ


More settings used specifically for MVG handling of SVG format. font-family font-stretch font-style font-weight encoding 'UTF-8' push defs push gradient 'def_name' linear X1,Y1 X2,Y2 stop-color 'color' where stop-color 'color' where # where is a point between the two pixels given (0 = X1,Y1 1= X2,Y2) gradient-units 'objectBoundingBox|userSpaceOnUse' affine .... pop gradient push gradient 'def_name' radial CX,CY FX,FY R # Here CX,CY is the center of the radial gradient of radius R # the FX,FY is the focal, and is usually the same a CX,CY # unless you are trying to warp the gradient in a specific direction stop-color 'color' where ... pop gradient pop defs push graphic-context fill 'url(#def_name)' ... draw things here ... pop graphic-context For examples see Florent Monnier's development site... http://www.linux-nantes.fr.eu.org/~fmonnier/OCaml/MVG/
MVGファイルの読み込み
上記の例からわかるように、MVGの "-draw" 引数は非常に長くなる可能性があります。実際、SVGからMVGへの変換では、非常に長いMVG描画引数が生成される可能性があります(下記参照)。ただし、IMの一般的なコマンドラインインターフェイスでは、「@filename
」引数を使用することで、ファイルから任意の文字列引数を読み込むことができます。これは、非常に長く複雑なMVG描画コマンドを別のファイルから読み込むことができるため便利です。たとえば、MVG操作を「draw_circles.mvg
」というファイルに入れた場合、次のように描画できます...
|
||
![]() |
![]() ![]() |
|
||
![]() |
![]() ![]() |
viewbox
」を追加し、適切な背景色の塗りつぶし描画を行うことで、初期キャンバス設定をMVG画像に移動できます。これで、MVG画像ファイルが完全な画像定義として完成します。
|
||
![]() |
![]() ![]() |
![]() ![]() |
現在、MVG引数文字列内から外部MVGファイルを読み込む方法は1つしかなく、それは「image 」描画プリミティブを使用することです。残念ながら、これはMVGインクルードをラスタ画像に変換してから、その画像を描画サーフェスにオーバーレイします。つまり、現在、MVGの「インクルード」機能はありません。 :-( |


You can generate the low level draw operations of IM, using the "+render
" to record them. When you then give a "-render
" setting/operator, IM will immediately draw those saved operations. Strangely just outputting to a "MVG" file also seems to do this... magick ... -draw '....' draw_commands.mvg NOTE: if you draw a curve while outputting a MVG format file, the file lists the curve as a series of short line segments, rather than the original curve. You can of course go the whole way and use the more universal SVG format. See "SVG format handling" below.
MVGアルファ合成


I have not seen any use of Alpha composition (other than 'painters' algorithm which is basically a 'over' alpha composition) for the drawing of objects. However that is not to say it can not be done. If you like to compose your rectangle, ellipse, circle, or whatever with a different alpha composition (such as 'DstOver' which is an Under-like composition), then draw your figure on a blank transparent canvas the same size as the original and compose it onto your image. However as SVG allows you to use alpha composition to draw text and other items onto images, I would imagine that it will be a future addition. Stay Tuned!
シンボルの描画
画像上の特定の点に、十字や円などの参照シンボルを描画したい場合があります。残念ながら、現時点ではIMにはそのようなシンボルを簡単に描画するコマンドはありませんが、少し手間をかけることで、そのようなシンボルを描画できます。シンボル描画テクニック
指定された場所のリストに複数のシンボルを描画するコツは、シェルスクリプトまたは使用しているAPIを使用してMVG描画コマンドを生成し、指定された点のセットを適切な描画コマンドのセットに変換することです。たとえば、ここでは点の線に魔法をかけ、それらの各点に「プラス」を付けています...
|
![]() |
tr
」を使用して各点(2つの数値)を1行につき1つの点に分離し、「awk
」を使用して、指定された点の上に「プラス」を描画するために必要なすべての数学的計算を行います。入力点リストに対してテキストマクロ拡張の形式を適用しているだけなので、これには好きなものを使用できます。ほぼすべてのプログラミング言語でこれが可能です。上記のシェルスクリプトの場合、「awk
」が最も簡単で最速の手段であるとわかりました。実際には、ImageMagick自体を使用して、「magick
」フォーマットオプションを使用して、その「マクロ」拡張を実行することもできます...たとえば、ここでは、この「点シンボル」の円周上の点を計算するためにそれを使用します。
|
![]() |
|
![]() |
M
」のみが必要になります。このため、IM描画が必要な位置決め数学を行うため、実際には浮動小数点計算はまったく必要ありません。![]() ![]() |
相対移動SVGパスアイテム「m 」は、IM v6.4.3-5より前のバージョンでは壊れています。IMがこれより古い場合、上記の(および次の)例では何も描画されない場合があります。古いバージョンの場合は、上記の相対移動「m 」を、相対線の適切なシーケンス「l 」に置き換えることで修正できます。 |
|
![]() |
magick
」コマンドにフィードされるという特別なシェルプログラミング手法を使用しています。最初の「エコー」は画像の描画キャンバスを定義して塗りつぶし、「while」ループは、与えられた各「点」を与えられた半径の円に変換します。この方法の利点は、他の2つの方法を使用した場合に発生する可能性のある文字列制限がないことです。生成できる他のシンボルには、ボックス、ダイヤモンド、エラーバーなどがあります。また、他の円メソッド(計算なしの相対「パス」円描画を含む)については、下の「円の描画」も参照してください。シンボル描画の代替手段
シンボルを画像に追加するには、直接描画する以外にも他の方法があります。シンボルフォント
シンボルフォントからシンボルを抽出し、小さなビットマップとして保存できます。これには、小さく事前定義されたカラフルな画像も使用できます。ただし、フォントを特定のピクセルに対して正確に配置する際に問題が発生する可能性があります。つまり、非常に正確なテクニックではありません。ただし、任意のピクセル位置に任意の画像を合成できます。たとえば、これらのシンボルは、これらのサンプルページでの特定の使用のために、多くのフォントから抽出されました。


















モルフォロジー
別の方法として、モルフォロジーを使用して、特別な「シェイプ」カーネル(「Disk
」、「Ring
」、および「Plus
」、または独自のユーザー定義カーネル)を使用して、単一ピクセルを「拡張」する方法もあります。たとえば...
magick -size 80x80 xc:black -fill white \ -draw 'point 20,15 point 55,30 point 40,60' points_pixels.gif magick points_pixels.gif -morphology Dilate Ring points_rings.gif magick points_pixels.gif -morphology Dilate Plus:4 points_pluses.gif magick points_pixels.gif -morphology Dilate Cross:3 points_crosses.gif |
![[IM Output]](points_pixels.gif)

![[IM Output]](points_rings.gif)
![[IM Output]](points_pluses.gif)
![[IM Output]](points_crosses.gif)
畳み込み
ほぼ同じテクニックとして、「畳み込み」を使用する方法もあります。これは、上記のように単純なオン/オフの結果だけでなく、さまざまなグレーシェードを設定できる、特別に設計されたカーネルを使用します。ユーザー定義カーネルを、画像の各チャンネル(赤、緑、青、およびアルファ)ごとに使用することで、各ピクセル座標から多色シンボルを作成することも可能です。![[IM出力]](../images/marker.png)
image2kernel
」を使用して、カラー画像(右を参照)を各チャンネルの個別の浮動小数点畳み込みカーネルに変換します。
|
marker_R.dat
」のような4つのファイル(非常に小さな入力画像の各チャンネルに1つ)が生成されます。これらは、画像のユーザー定義表現です(原点が画像の中央に配置されています)。これらのカーネルデータファイルを使用して、透明な背景に、それらの単一の点をカラフルなマーカー画像に畳み込みることができます。
magick points_pixels.gif -alpha off \ \( -clone 0 -morphology Convolve @marker_R.dat \) \ \( -clone 0 -morphology Convolve @marker_G.dat \) \ \( -clone 0 -morphology Convolve @marker_B.dat \) \ \( -clone 0 -morphology Convolve @marker_A.dat \) \ -delete 0 -channel RGBA -combine point_markers.png |
![[IM Output]](points_pixels.gif)

![[IM Output]](point_markers.png)
![]() ![]() |
IM v6.7.6-9より前のバージョンでは、結合オペレーターでは、画像の透明度チャンネルをアルファ値ではなく「不透明度」値として指定する必要があるため、作成された結果のアルファチャンネルを否定する必要があります。例:
|
convolve_image
」に変換されました。
convolve_image points_pixels.gif marker.png point_markers.png |
レイヤー化
ソース画像から抽出したピクセルのリストを使用して配置する、画像のレイヤーなどの別のテクニックの方が適している場合があります。前景画像の前に、より遠くのシンボル画像を最初にオーバーレイすることができ、どのシンボルがどの点を置き換えるかをプログラムで選択またはランダム化できます。この例については、地図のピンを参照してください。円の描画
描画オプションは、非常に基本的なことを行うためのいくつかの方法を提供します... 円の描画。たとえば、円周上の任意の点を通過する円を描画できます。したがって、中心点と、最初の点から半径(たとえば25ピクセル)離れた2番目の点を計算する必要があります。
|
![]() |
|
![]() |
-draw
」操作が必要になるか、コンテキストのプッシュを使用する必要があります。楕円を使用すると、軸の長さとして半径を直接指定できます。
|
![]() |
stroke-linecap round
」を使用して非常に短い線を描画することで円を生成することもできます。ストローク幅は、円の直径を設定します。注意:線は(どれほど小さくても)ある程度の長さがないと、何も描画されません。
|
![]() |
|
![]() |
M
」だけです。後続のパスコンポーネントの「25
」と「50
」は、この中心に対する円の半径と直径を定義します。![]() ![]() |
相対移動のSVG パスアイテム 'm ' は IM v6.4.3-5 以前では壊れています。お使いの IM がこれより古い場合、円は単一のピクセルとしてしか表示されない可能性があります。古いバージョンでは、上記の 'm ' を 'l ' に置き換えることで修正できます。 |
|
![]() |
|
![]() |
|
![]() |
矢印の描画-- シンボルの位置、回転、およびスケール
上記の手法を使用して、線のまさに終点にポイントが来るように位置決めし、その上に描画できる矢印ヘッドなどの特別なシンボルを作成できます。線 (一般的な状況) の後に矢印を描画すると、矢印は線の上に描画されます。ただし、定義できる矢印には 3 つのタイプがあり、各タイプは用途に応じて異なる方法で定義されます。- 測定:一部の工学図で測定の限界を示すために、線の両端を矢印ヘッドでマークするだけの場合。非常に簡単です。
- ベクトル:ある値の方向と強さを示す場合。
たとえば、天気風のチャートなどです。テールが必要で、0,0 点はテールの終点です。多くの場合、このようなベクトルの大きなグリッドが作成されます。 - インジケーター:詳細を指摘する場合。
この場合、0,0 点は、矢印の先端、または矢印自体のいくらか手前にする必要があります。
測定矢印
線の端に矢印ヘッドを追加するのは比較的簡単です。基本的には「矢印ヘッド」のシンボルを作成し、正しい位置に描画します。たとえば...
|
![]() |
path
' 定義から位置を移動できるという利点もあり、「定数」としてパス全体を指定できます...
|
![]() |
|
![]() |
|
![]() |
-draw
」操作で実行したいと思うかもしれません。たとえば、線を描画してから、両端に矢印を追加し、色、位置、回転、場合によっては異なるスケールの異なるセットが必要とします。つまり、キャンバスのワーピングの範囲を、個々の矢印ヘッドの描画に制限する必要があります。範囲を制限しないと、後で他の描画操作に影響を与える可能性があり、何を生成しているのかを正確に把握できなくなる可能性があります。ワーピング(および他のすべての描画属性)の範囲を制限するには、関係するセクションを「graphic-context
」でラップします...
|
![]() |
push
' は基本的に、現在のすべての描画属性を後で使用するために保存し、'pop
' は、以前に保存した設定で設定 (色、ワーピング、位置など) を置き換えて、これらの属性を復元します。これは、'ポップ' 後に 'キャンバスワーピング' がキャンセルされ、変更する前の状態に描画が戻ることを意味します。上記の手法は、矢印を生成する 1 つの方法にすぎません。技術図面などで距離を測定する際の一部として矢印を描画する場合に適しています。ベクトル矢印
前述のように、ベクトルは、ある値の方向と強度を示します。つまり、矢印の長さは可変であり、矢印ヘッドはベクトルの開始点から離れたほぼ任意の位置に配置できます。ベクトルの長さと角度に基づいて矢印ヘッドを配置する必要がある位置を計算するために多くの数学演算を実行できますが、ImageMagick にそれらの計算を実行させる方がはるかに優れた方法があります。解決策は、ワーピングキャンバス空間で、ベクトルの長さを正しい長さの水平線として描画することです。その線が描画されたら、キャンバスを「ワーピング」したまま、描画空間を線の終点に再度変換するだけです。これで、ベクトルの「矢印ヘッド」を通常どおり描画するための正しい回転で、正しく配置されました。たとえば、ここでは、-35 度の角度で 70 ピクセル長のベクトルを生成します。
|
![]() |
インジケータ矢印
上記では、前のベクトル矢印の開始点を指すインジケータ矢印も示しました。ただし、以前のように矢印を描画する代わりに、原点 (または開始点) から 10 ピクセル離れた位置から始まる逆向きの矢印記号として作成しました。つまり、シンボルは示したい位置にあるため、実際にはその位置の真上に矢印を配置するのではなく、そこから少し離れた場所に配置したいのです。インジケータは、通常、可変長を必要としないため、ベクトルよりも処理が簡単ですが、通常はインジケータの遠端にテキストを追加して、示されている内容を指定する必要があります。以前と同様に、その位置を計算するのは難しい可能性があるため、あえて行う必要はありません。テキストを配置するための解決策も、ベクトルと同じです。インジケータ矢印の描画に使用した元のワーピング空間を保持し、原点をその矢印のテールエンド (ワーピング空間では水平方向に 40 ピクセル) に変換します。再配置したので、新しい位置の周りのワーピングの回転を解除して、テキストを通常どおり (わずかなオフセット付き) に描画できます。残念ながら、上記のテキストのデフォルトの左揃えは機能しますが、現在、MVG で重力とは別の設定としてテキストの配置を指定することはできません。これが問題の場合は、IM バグフォーラムにリクエストしてください。特に SVG 仕様の一部であるため、テキストの配置 (重力位置とは別) が実現することを願っています。オブジェクトの描画
色の広いストローク
さまざまな図形を作成するために、パスやアウトラインで塗りつぶし領域を完全に囲む必要はありません。非常に大きくて広いストロークを使用すると、キャンバス上に大きな領域や色の見本を生成できます。たとえば、広いストロークの楕円弧は、ポスターの作成に使用されているのが実際に見られた、美しい色の領域を生成できます。
|
![]() |
|
![]() |
円柱
IM フォーラムディスカッションでは、ImageMagick の描画コマンドを使用して、円柱、特に影付きの円柱を描画することについて議論が交わされました。円柱の描画のコツは、「roundrectangle
」プリミティブを描画して、端が楕円を形成するようにすることです。つまり、円柱の幅が 50 ピクセルの場合、長方形の角をそれぞれ 25 ピクセルと 12 ピクセルで丸めます。つまり、長方形の幅の半分、そしてさらに半分です。したがって、円柱は、互いに重ねて描画された 2 つの丸い長方形になります。2 番目のより明るい色の塗りつぶし「端の楕円」は、両方のコーナーの寸法を正確に 2 倍にサイズ調整します。たとえば...
|
![]() |
|
![]() |
cylinder_bar
」です...スクリプトは、スクリプトの先頭で定義されたサイズやその他の設定に基づいて、すべてのパラメータを適切に調整し、任意のサイズの画像を生成できます。また、内側の色付きの円柱と半透明のガラス円柱との間にギャップを作成するための「ガラスの厚さ」の概念も含まれています。特に緑色の円柱の端がガラス円柱の端と重なっているときの、円柱の非常に微妙な陰影に注目してください。少しばかりの先見の明があれば、何ができるか驚くべきです。テキスト文字列での特殊文字の描画
引用符かバックスラッシュか?
-draw で人々が抱える最大の問題の 1 つは、UNIX シェルや DOS コマンドライン、さらには C、Perl、PHP、R、または Visual Basic などの他の言語にとっても特別な意味を持つ文字を描画することです。この点で最大の原因は、2 つのタイプの引用符文字と、ドル '$
' やシェル、ImageMagick エスケープ文字であるバックスラッシュ '\
' などの変数置換文字です。基本的に、"-draw
" の MVG 引数は引用符で囲む必要があり、'text
' 文字列引数内にも追加の引用符が必要になる場合があります。この問題を解決するために、ユーザーは通常、2 つの異なる引用符文字を使用します。1 つはシェル用、もう 1 つは MVG テキスト文字列用です。-draw '... text 0,0 "string" ...'
-
-draw "... text 0,0 'string' ..."
$
' を使用して、シェル変数の置換を含めることができます。適切な形式を選択するとほとんどの問題が解決しますが、一部の文字は依然として困難であり、各ソリューションは使用する引用符の正確なセットによって異なります。これは、特殊文字をどのようにエスケープする必要があるかを定義するからです。以下に、引用符の 4 つのケースと、特殊文字の処理を示します。- シェル引数に単一引用符を使用する場合
MVG テキスト文字列の周りに二重引用符を使用します。描画テキスト文字列を処理する最も簡単な手法は、ラップするシェル引数に単一引用符を使用することです。ただし、これは、描画された文字列にアポストロフィを含めるには、シェルの「単一引用符モード」を終了し、シェルの単一引用符の外側でそのアポストロフィを指定する必要があることを意味します。たとえば、ここで説明した 4 つの特殊文字を処理する方法を次に示します。magick -size 250x50 xc:none -box white -pointsize 20 -gravity center \ -draw 'text 0,0 " '\'' \" $ \\ " ' \ -trim +repage text_special_sd.gif
- シェル引数に二重引用符を使用する場合
MVGテキスト文字列をシングルクォートで囲みます。描画する文字列に「シェル変数」を挿入したい場合は、外側のシェル引数にダブルクォートを使用する必要があります。これにより、状況はより複雑になります。シェルによる保護がなくなり、ドル記号「$
」だけでなく、バックスラッシュ「\
」もエスケープする必要があるからです。一方で、シェルは引数の区切り文字としてシングルクォートを使用する必要がなくなるため、その点は単純化されます。特殊文字の短いリストについて結果をまとめましょう。magick -size 250x50 xc:none -box white -pointsize 20 -gravity center \ -draw "text 0,0 ' \\' \" \$ \\\\ ' " \ -trim +repage text_special_ds.gif
- シェル引数に単一引用符を使用する場合
MVGテキスト文字列をシングルクォートで囲みます。最後に、残りの2つのクォートの組み合わせをまとめます。シェルとMVGでどのようにデコードされるかは、ご自身で考えてみてください。magick -size 250x50 xc:none -box white -pointsize 20 -gravity center \ -draw 'text 0,0 '\'' \'\'' " $ \\ '\'' ' \ -trim +repage text_special_ss.gif
- シェル引数に二重引用符を使用する場合
MVGテキスト文字列をダブルクォートで囲みます。magick -size 250x50 xc:none -box white -pointsize 20 -gravity center \ -draw "text 0,0 \" ' \\\" \$ \\\\ \"" \ -trim +repage text_special_dd.gif
-draw
"引数は、コマンドラインシェルと、MVGテキスト文字列内のバックスラッシュおよびクォートのエスケープの両方を処理する必要があります。結果は混乱しやすく、扱いにくい場合があります。シェルは2種類のクォートを異なる方法で扱い、MVGテキスト文字列はそうではないことを覚えておいてください。もちろん、複雑なスクリプトでは、シェルやスクリプトの問題を完全に避ける方が良い場合があります。これは、"-draw
"引数をMVG描画ファイルから読み込むことで実現できます。-draw @drawfile.mvg
|
|
![]() |
|
![]() ![]() |
MVG
」テキストファイルの1つからのものです。シェルエスケープやクォートは含まれていません。そのため、MVGクォートとエスケープのみが存在します。上記で、MVGテキスト文字列にシングルクォートを使用した場合、唯一の変更点は、文字列内のダブルクォート文字ではなく、シングルクォート文字をバックスラッシュでエスケープする必要があることでした。パーセント文字について「-draw text」演算子における特別な「エスケープ」文字に関する最後の点です。パーセント文字「%
」は「そのまま」描画されるはずです。描画するために特別なことは何もする必要はありません。「そのまま」描画されない場合は、古いバージョンのIMを使用しているため、すぐにアップグレードする必要があります。![]() ![]() |
IMバージョン6.2.4までは、「% 」文字は描画されたテキスト文字列に追加の画像情報を含めるためのエスケープ文字として使用されていました。SVG画像もパーセント文字を描画しようとすると、そのようなエスケープは紛らわしく、正しくないため、これはもはや当てはまりません。 |
\n
」改行エスケープ)のこの使用法は、「-draw
」演算子およびSVG画像形式を処理するためのMVG形式の意図された使用法と互換性がないと見なされました。そのため、IMバージョン6.2.4以降、%エスケープは機能せず、バックスラッシュ自体とその周囲のクォートのみがエスケープされます。
|
![]() |
-draw
」を使用する際の回避策については、「パーセントバグの描画」ページをご覧ください。描画の代わりに注釈このような問題を回避するより良い方法は、テキスト描画に描画ではなく「-annotate」を使用することです。この演算子は描画演算子のラッパーであり、描画のすべての機能をより単純な形式で使用できます。基本的に、この演算子に必要なクォートは1セット(シェル用)のみです。これにより、特殊文字の処理がはるかに簡単になります。残念ながら、IMのクォートをエスケープする必要はなくなりましたが、今度は「@
」ファイル読み込み、「\n
」改行、およびその他のパーセントエスケープ展開などのパーセントエスケープが必要になりました。たとえば、シングルクォートを使用すると...
|
![]() |
|
![]() |
@
」エスケープを使用してファイルから文字列を読み込むと、注釈のすべてのクォートとエスケープは完全に無視されます。たとえば、ここに画像の幅と高さに関する情報を含めます。
|
![]() |
|
![]() |
IMとSVGの処理
SVG 入力ドライバ:RSVG vs MSVG
実際のSVG画像形式の処理は非常に複雑な作業です。エンジンは、SVG -- Scalable Vector Graphicsドキュメントで定義されているように、そのすべての側面を処理する必要があります。これには、多くのプログラミングの労力と時間が必要です。したがって、ImageMagickはSVG形式画像の処理に2つの方法を提供します。1つ目は、オープンソースのRSVGライブラリを使用して、SVG形式をIMが問題なく処理できるラスター画像に変換する方法です。このエンジンは、SVG処理のほぼすべての側面で完了しています。2番目の方法は、IMがMSVGと呼ばれる組み込みメソッドを使用してSVGをMVGに変換しようとする方法です。MSVGは、SVG画像をIMの「-draw」演算子「MVG」描画言語に変換しようとします。draw MVGの機能の多くは、この目的のために特別に作成されました。残念ながら、基本的な線画と色付けは存在しますが、完全なSVGコンバーターとはほど遠いものです。特別な入力形式「MSVG:
」を使用してSVG画像を読み取ることで、内部MSVGコンバーターの使用を強制できます(IM v6.3.4で追加)。ただし、RSVGライブラリが存在する場合、ほとんどのImageMagickは代わりにそれを使用してSVG画像をレンダリングします。IMが何をするかを確認するには、次を使用します...括弧内の「RSVG
」でわかるように、私のIMはコンピューターに存在するRSVGライブラリを、指定されたバージョンで使用します。ここでは、白い背景に単純な対角グラデーションを持つ長方形を作成する、小さな手作りのSVG画像「diagonal.svg」(フォーラムユーザーpenciledinの寄稿)を「描画」します。
|
![]() |
ただし、これを内部MSVG(RSVGライブラリが存在しない場合のデフォルト)を使用してレンダリングすると...
|
![]() |
- 非垂直グラデーション(新しいMVGグラデーション処理への変換なし)
- 曲線パスに沿ったテキスト
- テキストの均等配置(重力とは別)
SVG 設定
SVG画像形式はベクター形式であり(ベクター画像形式についてを参照)、通常、画像にはデフォルトの「サイズ」はありません。代わりに、ポストスクリプトと同様に、特定の「-density
」(デフォルト密度は72 dpi)で「描画」または「レンダリング」されます。また、SVGが背景を「ペイント」しない場合は、「-background
」設定を使用して、使用する背景色を指定できます。たとえば、これは別の小さなSVG画像「home.svg
」で、透明な背景を含む3つの異なる背景を使用して、3つの異なる密度を使用して「レンダリング」されています。
magick -density 36 home.svg home_1.gif magick -background skyblue home.svg home_2.gif magick -density 144 -background none home.svg home_3.png |
![[IM Output]](home_1.gif)
![[IM Output]](home_2.gif)
![[IM Output]](home_3.png)
![]() ![]() |
一部のSVG画像はスケールしないことがわかりました。つまり、「ポイント」、「インチ」、「ミリメートル」などの実際の長さではなく、「ピクセル」で定義されています。その結果、「-density 」設定で画像全体のサイズ(実際の単位)が変更される場合がありますが、「ピクセル」のサイズは変更されないため、画像自体のサイズは変更されません。ただし、このようなSVG画像は非常にまれです。さらに悪いことに、一部のSVG画像では「ピクセル」と「ポイント」の測定値が混在しており、作者が意図的にこれを行ったのでない限り、作者が意図した密度とは異なる密度で使用しようとすると、実際に混乱が生じる可能性があります。これらはさらにまれです。 簡単な修正方法は、通常、SVG内のすべての「ピクセル」単位を「ポイント」に変更することだけですが、「ピクセル」の使用が意図的に使用された場合に備えて、盲目的に行うべきではありません。 |
SVG 出力処理
IM v6.4.2以降、IMは任意のビットマップ画像をSVGベクターグラフィックに変換できます。変換は必ずしも成功するとは限りませんが、大きくて/または単純な画像(ビットマップマスクなど)は非常にうまく変換されます。たとえば、ここでは、ひどいビットマップ形状をSVG画像に変換し、再び変換して、ビットマップを適切なアンチエイリアス形状にスムーズにします。
magick -pointsize 72 -font Candice label:A -threshold 50% \ -trim +repage -bordercolor white -border 5x5 A.gif magick A.gif A.svg magick A.svg A.png |
![]() |
![]() |
|
![]() |
![]() |
AutoTrace
" ライブラリがインストールされている必要があり、IM は "--with-autotrace
" スイッチで設定されている必要があります。"AutoTrace
" ライブラリがインストールされておらず、IM にコンパイルされていない場合、生成される SVG 出力は、滑らかな SVG のアウトライン画像ではなく、多数の単一ピクセル円となり、バイナリ結果が生成されます。このような画像は比較して巨大になり、SVG レンダラーによるレンダリングに非常に時間がかかることがよくあります。より良いデフォルトのラスターからベクターへの変換手法が必要です。おそらく、モルフォロジー骨格化と MAT 手法を使用する必要があります。"autotrace:
" という 入力デリゲート があり、"autotrace
" コマンドを直接使用して、上記の手順をすべて一度に行う「入力ビットマップ画像を滑らかにする」機能がありました。しかし、最後に確認したとき、このデリゲートは消えていました。これは、その使い方です...
|
![]() |
autotrace
" コマンドからの SVG 出力を取得するのではなく、入力画像を SVG を通してフィルタリングして滑らかにするだけです。代替手段として、ラスターからベクターへのエッジングとAutoTrace を使用したスケルトンの例に示すように、"autotrace" コマンドを直接使用することもできます。また、写真の変換ソリューションを検討した cancerberosgx による SVG 画像の生成の結果もご覧ください。非 IM ベクターグラフィックエディター
ImageMagick はピクセル配列プロセッサです。一般的に、ベクター画像(「MVG」が唯一の例外)を保存することはなく、それらを読み込んでピクセル配列に変換するだけです。これは、Gimp や Photoshop などの他のピクセル画像エディターにも当てはまります。ベクターベースの画像を編集および処理するには、次のようなプログラムを使用します。Sodipodi | SVG ベースのベクターグラフィックスエディター |
Xfig | シンプルですが非常に優れたベクターオブジェクトエディター (看板、地図、ページへの写真の配置に最適) |
Dia | |
AutoTrace | ビットマップ配列の形状をベクターアウトラインに変換 |
Sketch | 曲線テキストを備えた Python ベースのベクターエディター |