Color Modes

Magick Vector Graphics

MVGの概要描画プリミティブ

この仕様では、ImageMagickにおける二次元ベクトルおよび混合ベクトル/ラスターグラフィックスを記述するためのモジュール化された言語であるMagick Vector Graphics(MVG)の機能と構文を定義します。この言語を使用して、コマンドライン、MVGファイル、SVG(Scalable Vector Graphics)ファイル、またはImageMagickのプログラムインターフェースから描画できます。たとえば、円弧を描画するには、次のコマンドを使用します。

magick -size 100x60 canvas:skyblue -fill white -stroke black \
  -draw "path 'M 30,40  A 30,20  20  0,0 70,20 A 30,20  20  1,0 30,40 Z '" \
  arc.png

そして、結果は次のようになります。

    arc

描画が十分に複雑になった場合は、グラフィックプリミティブをMVGファイルにまとめることをお勧めします。この例では、piechart.mvgを使用します。

push graphic-context
  viewbox 0 0 624 369
  affine 0.283636 0 0 0.283846 -0 -0
  push graphic-context
    push graphic-context
      fill 'darkslateblue'
      stroke 'blue'
      stroke-width 1
      rectangle 1,1 2199,1299
    pop graphic-context
    push graphic-context
      font-size 40
      fill 'white'
      stroke-width 1
      text 600,1100 'Average: 20.0'
    pop graphic-context
    push graphic-context
      fill 'red'
      stroke 'black'
      stroke-width 5
      path 'M700.0,600.0 L340.0,600.0 A360.0,360.0 0 0,1 408.1452123287954,389.2376150414973 z'
    pop graphic-context
    push graphic-context
      font-size 40
      fill 'white'
      stroke-width 1
      text 1400,140 'MagickWand for PHP'
    pop graphic-context
    push graphic-context
      font-size 30
      fill 'white'
      stroke-width 1
      text 1800,140 '(10.0%)'
    pop graphic-context
    push graphic-context
      fill 'red'
      stroke 'black'
      stroke-width 4
      rectangle 1330,100 1370,140
    pop graphic-context
    push graphic-context
      fill 'yellow'
      stroke 'black'
      stroke-width 5
      path 'M700.0,600.0 L408.1452123287954,389.2376150414973 A360.0,360.0 0 0,1 976.5894480359858,369.56936567559273 z'
    pop graphic-context
    push graphic-context
      font-size 40
      fill 'white'
      stroke-width 1
      text 1400,220 'MagickCore'
    pop graphic-context
    push graphic-context
      font-size 30
      fill 'white'
      stroke-width 1
      text 1800,220 '(29.0%)'
    pop graphic-context
    push graphic-context
      fill 'yellow'
      stroke 'black'
      stroke-width 4
      rectangle 1330,180 1370,220
    pop graphic-context
    push graphic-context
      fill 'fuchsia'
      stroke 'black'
      stroke-width 5
      path 'M700.0,600.0 L976.5894480359858,369.56936567559273 A360.0,360.0 0 0,1 964.2680466142854,844.4634932636567 z'
    pop graphic-context
    push graphic-context
      font-size 40
      fill 'white'
      stroke-width 1
      text 1400,300 'MagickWand'
    pop graphic-context
    push graphic-context
      font-size 30
      fill 'white'
      stroke-width 1
      text 1800,300 '(22.9%)'
    pop graphic-context
    push graphic-context
      fill 'fuchsia'
      stroke 'black'
      stroke-width 4
      rectangle 1330,260 1370,300
    pop graphic-context
    push graphic-context
      fill 'blue'
      stroke 'black'
      stroke-width 5
      path 'M700.0,600.0 L964.2680466142854,844.4634932636567 A360.0,360.0 0 0,1 757.853099990584,955.3210081341651 z'
    pop graphic-context
    push graphic-context
      font-size 40
      fill 'white'
      stroke-width 1
      text 1400,380 'JMagick'
    pop graphic-context
    push graphic-context
      font-size 30
      fill 'white'
      stroke-width 1
      text 1800,380 '(10.6%)'
    pop graphic-context
    push graphic-context
      fill 'blue'
      stroke 'black'
      stroke-width 4
      rectangle 1330,340 1370,380
    pop graphic-context
    push graphic-context
      fill 'lime'
      stroke 'black'
      stroke-width 5
      path 'M700.0,600.0 L757.853099990584,955.3210081341651 A360.0,360.0 0 0,1 340.0,600.0 z'
    pop graphic-context
    push graphic-context
      font-size 40
      fill 'white'
      stroke-width 1
      text 1400,460 'Magick++'
    pop graphic-context
    push graphic-context
      font-size 30
      fill 'white'
      stroke-width 1
      text 1800,460 '(27.5%)'
    pop graphic-context
    push graphic-context
      fill 'lime'
      stroke 'black'
      stroke-width 4
      rectangle 1330,420 1370,460
    pop graphic-context
    push graphic-context
      font-size 100
      fill 'white'
      stroke-width 1
      text 100,150 'ImageMagick'
    pop graphic-context
    push graphic-context
      fill 'none'
      stroke 'black'
      stroke-width 5
      circle 700,600 700,960
    pop graphic-context
  pop graphic-context
pop graphic-context

このコマンドで円グラフを描画します。

magick mvg:piechart.mvg piechart.png

これにより、次のレンダリングが生成されます。

    piechart

ただし、一般的にMVGは扱いが難しいので、SVG形式でグラフィックスを生成するプログラムを使用することをお勧めします。ImageMagickはSVGをMVGに自動的に変換して画像をレンダリングします。たとえば、piechart.svgを次のコマンドでレンダリングします。

magick mvg:piechart.svg piechart.jpg

これにより、MVG言語で作成したのと同じ円グラフが生成されます。

描画は、多くのImageMagick プログラムインターフェースからも利用できます。ImageMagickは描画API呼び出しをMVGに変換してレンダリングします。MagickWand言語で記述されたコード例を以下に示します。

(void) PushDrawingWand(draw_wand);
{
  const PointInfo points[6] =
  {
    { 180,504 },
    { 282.7,578.6 },
    { 243.5,699.4 },
    { 116.5,699.4 },
    { 77.26,578.6 },
    { 180,504 }
  };

  DrawSetStrokeAntialias(draw_wand,True);
  DrawSetStrokeWidth(draw_wand,9);
  DrawSetStrokeLineCap(draw_wand,RoundCap);
  DrawSetStrokeLineJoin(draw_wand,RoundJoin);
  (void) DrawSetStrokeDashArray(draw_wand,0,(const double *)NULL);
  (void) PixelSetColor(color,"#4000c2");
  DrawSetStrokeColor(draw_wand,color);
  DrawSetFillRule(draw_wand,EvenOddRule);
  (void) PixelSetColor(color,"#800000");
  DrawSetFillColor(draw_wand,color);
  DrawPolygon(draw_wand,6,points);
}
(void) PopDrawingWand(draw_wand);

MVGの概要

MVGはコマンド間のすべての空白を無視します。これにより、1行に複数のMVGコマンドを記述できます。MVGの編集と読みやすさを向上させるために、各MVGコマンドを改行で終わらせるのが一般的な慣習です。この構文の説明では、MVGシーケンスのインデントを使用して理解を助けています。インデントはサポートされていますが、必須ではありません。

メタファイルラッパー構文(スタンドアロンMVGファイルをサポートするため)

push graphic-context
  viewbox 0 0 width height
  [ any other MVG commands ]
pop graphic-context

パターン構文(コンテキストの保存と復元)

push pattern id x,y width,height
 push graphic-context
  [ drawing commands ]
 pop graphic-context
pop pattern

例は(%sは識別子文字列です)

push defs
 push pattern %s 10,10 20,20
  push graphic-context
   fill red
   rectangle 5,5 15,15
  pop graphic-context
  push graphic-context
   fill green
   rectangle 10,10 20,20
  pop graphic-context
 pop pattern
pop defs

画像のタイル表示には、

push pattern id x,y width,height
 image Copy ...
pop pattern

塗りつぶしまたはストロークのどちらにもパターンを使用できます。

stroke url(#%s)

または

fill url(#%s)

クリップパスはクリッピング領域を定義します。クリッピング領域内のみが描画対象となります。クリッピング領域の外側はマスクされます。

push defs
 push clip-path "myClipPath"
  push graphic-context
   rectangle 10,10 20,20
  pop graphic-context
 pop clip-path
pop defs
clip-path url(#myClipPath)

描画プリミティブ

MVG描画プリミティブの完全な説明を以下に示します。

プリミティブ 説明
affine sx,rx,ry,sy,tx,ty
arc x0,y0 x1,y1 a0,a1
bezier x0,y0 ... xn,yn Bezier(スプライン)は、形状を定義するために3つ以上のx、y座標が必要です。最初の点と最後の点はノット(保存された座標)であり、中間座標は制御点です。2つの制御点が指定されている場合、各端ノットとその順次対応する制御点間の線は、その端での曲線の接線方向を決定します。1つの制御点が指定されている場合、端ノットから1つの制御点までの線は、各端での曲線の接線方向を決定します。2つ以上の制御点が指定されている場合、追加の制御点は組み合わせて曲線の中間形状を決定します。複雑な曲線を描画するには、Pathプリミティブを使用するか、開始ノットと終了ノットが連続するセグメントで繰り返される複数の4点ベジエセグメントを描画することを強くお勧めします。
border-color color
circle originx,originy perimeterx,perimetery
clip-path url(name)
clip-rule rule これらのルールタイプから選択します。
evenodd
nonzero
clip-units units これらの単位タイプから選択します。
userSpace
userSpaceOnUse
objectBoundingBox
color x,y method これらのメソッドタイプから選択します。
point
replace
floodfill
filltoborder
reset
compliance type これらのコンプライアンスタイプから選択します:MVGまたはSVG
decorate type これらの装飾タイプから選択します。
none
line-through
overline
underline
ellipse centerx,centery radiusx,radiusy arcstart,arcstop
fill color これらのから選択します。
fill-opacity opacity 不透明度は0.0(完全に透明)から1.0(完全に不透明)の範囲、またはパーセンテージ(例:50%)で指定します。
fill-rule rule これらのルールタイプから選択します。
evenodd
nonzero
font name
font-family family
font-size point-size
font-stretch type これらのストレッチタイプから選択します。
all
normal
ultra-condensed
extra-condensed
condensed
semi-condensed
semi-expanded
expanded
extra-expanded
ultra-expanded
font-style style これらのスタイルから選択します。
all
normal
italic
oblique
font-weight weight これらのウェイトから選択します。
all
normal
bold
100
200
300
400
500
600
700
800
900
gradient-units units これらの単位から選択します。
userSpace
userSpaceOnUse
objectBoundingBox
gravity type これらのグラビティタイプから選択します。
NorthWest
North
NorthEast
West
Center
East
SouthWest
South
SouthEast
image compose x,y width,height 'filename' これらの合成演算から選択します。
メソッド 説明
clear 宛先のカラーとアルファの両方がクリアされます。ソースと宛先のどちらも入力として使用されません。
src ソースが宛先にコピーされます。宛先は入力として使用されません。
dst 宛先は変更されません。
src-over ソースが宛先に合成されます。
dst-over 宛先がソースに合成され、その結果が宛先を置き換えます。
src-in 宛先の内側に位置するソースの部分が宛先を置き換えます。
dst-in ソースの内側に位置する宛先の部分が宛先を置き換えます。
src-out 宛先の外側に位置するソースの部分が宛先を置き換えます。
dst-out ソースの外側に位置する宛先の部分が宛先を置き換えます。
src-atop 宛先の内側に位置するソースの部分が宛先に合成されます。
dst-atop ソースの内側に位置する宛先の部分がソースに合成され、宛先を置き換えます。
multiply ソースが宛先に掛け合わされ、宛先を置き換えます。結果の色は、常に2つの構成要素の色よりも少なくとも暗くなります。黒で任意の色を乗算すると黒になり、白で任意の色を乗算すると元の色のままになります。
screen ソースと宛先が補完され、次に掛け合わされ、宛先を置き換えます。結果の色は、常に2つの構成要素の色よりも少なくとも明るくなります。白で任意の色をスクリーンすると白になり、黒で任意の色をスクリーンすると元の色のままになります。
overlay 宛先の色の値に応じて、色を乗算またはスクリーンします。ソースの色は宛先の上に重ねられ、そのハイライトとシャドウを保持します。宛先のカラーは置き換えられませんが、宛先の明るさまたは暗さを反映するためにソースカラーと混合されます。
darken 宛先の色とソースの色の中でより暗い方を選択します。ソースの方が暗い場合、宛先はソースに置き換えられます。そうでない場合は、変更されません。
lighten 宛先の色とソースの色の中でより明るい方を選択します。ソースの方が明るい場合、宛先はソースに置き換えられます。そうでない場合は、変更されません。
linear-light 前景のトーン値に影響を与えながら、コントラストをわずかに上げます。
color-dodge ソースの色を反映するように宛先のカラーを明るくします。黒でペイントしても変化はありません。
color-burn ソースの色を反映するように宛先のカラーを暗くします。白でペイントしても変化はありません。
hard-light ソースカラー値に応じて色を乗算またはスクリーンします。ソースカラーが0.5より明るい場合、宛先はスクリーンされたかのように明るくなります。ソースカラーが0.5より暗い場合、宛先は乗算されたかのように暗くなります。明るさまたは暗さの程度は、ソースカラーと0.5の差に比例します。0.5と等しい場合、宛先は変更されません。純粋な黒または白でペイントすると黒または白が生成されます。
soft-light ソースカラー値に応じて色を暗くするか明るくします。ソースカラーが0.5より明るい場合、宛先は明るくなります。ソースカラーが0.5より暗い場合、宛先は焼き付けられたかのように暗くなります。暗さまたは明るさの程度は、ソースカラーと0.5の差に比例します。0.5と等しい場合、宛先は変更されません。純粋な黒または白でペイントすると、明らかに暗いか明るい領域が生成されますが、純粋な黒または白にはなりません。
plus ソースが宛先に追加され、宛先を置き換えます。この演算子は、2つの画像間のディゾルブをアニメーション化する場合に役立ちます。
add 'plus'と同様ですが、透過データはマット値として扱われます。そのため、どちらかの画像の透明な領域は透明なままです。
minus ソースイメージの色を宛先イメージから減算します。透過が含まれる場合、不透明な領域は宛先の不透明な領域から減算されます。
subtract ソースイメージの色を宛先イメージから減算します。透過が含まれる場合、透明な領域が減算されるため、ソースの不透明な領域のみが宛先イメージで不透明なままです。
difference 2つの構成要素の色の中でより暗い方をより明るい方から減算します。白でペイントすると宛先のカラーが反転し、黒でペイントしても変化はありません。
exclusion 'difference'と同様の効果を生み出しますが、コントラストは低くなります。白でペイントすると宛先のカラーが反転し、黒でペイントしても変化はありません。
xor 宛先の外側に位置するソースの部分と、ソースの外側に位置する宛先の部分が結合されます。
copy-* ソースイメージの指定されたチャンネルを宛先イメージの同じチャンネルにコピーします。ソースイメージに指定されたチャンネルが存在しない場合(メソッド'copy-opacity'または'copy-black'でのみ発生する可能性があります)、ソースイメージはコピーされる値の特別なグレースケールチャンネルイメージであると見なされます。
change-mask ソースイメージのピクセルと同様の宛先ピクセル(現在の-fuzz係数で定義)を透過で置き換えます。
interline-spacing pixels
interword-spacing pixels
kerning pixels
line x,y x1,y1
matte x,y method これらのメソッドから選択します。
point
replace
floodfill
filltoborder
reset
offset offset
opacity opacity パーセンテージ(例:50%)を使用します。
path path
point x,y
polygon x,y x1,y1, ..., xn,yn
polyline x,y x1,y1, ..., xn,yn
クリップパスのポップ
defsのポップ
グラデーションのポップ
グラフィックコンテキストのポップ
パターンのポップ
クリップパス "name" のプッシュ
defsのプッシュ
グラデーションのプッシュ id 線形 x,y x1,y1
グラデーションのプッシュ id 放射状 xc,yc xf,yf 半径
グラフィックコンテキストのプッシュ { "id" } idはオプションです。
パターンのプッシュ id x,y 幅,高さ
長方形 x,y x1,y1
回転 角度
角丸長方形 x,y x1,y1 幅,高さ
拡大縮小 x,y
X方向の傾斜 角度
Y方向の傾斜 角度
ストップカラー 色 オフセット
ストローク
ストロークアンチエイリアス 0 ・ 1
ストロークダッシュアレイ なし ・ 数値リスト
ストロークダッシュオフセット オフセット
ストロークラインキャップ タイプ 以下のキャップタイプから選択してください。
butt
round
square
ストロークラインジョイン タイプ 以下のジョイントタイプから選択してください。
bevel
miter
round
ストロークミターリミット リミット
ストローク不透明度 不透明度 不透明度は0.0(完全に透明)から1.0(完全に不透明)の範囲、またはパーセンテージ(例:50%)で指定します。
ストローク幅
テキスト "テキスト"
テキストアンチエイリアス 0 ・ 1
テキスト下色
平行移動 x,y
使用 "url(#id)"
ビューボックス x,y x1,y1

プリミティブは大文字と小文字が区別されます(例: viewboxではなくviewBoxを使用)。