⚠️ これは 非公式の翻訳サイトです。ImageMagick Studio LLC とは無関係です。正確な情報は 原文(https://imagemagick.org/magick-vector-graphics/) を参照してください。

MVG(Magick Vector Graphics)

MVG 概要描画プリミティブ

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

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

なお、パターンは次のように fill または stroke のどちらにも使えます:

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

ベジエ(スプライン)は、形状を定義するのに 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

次の gravity タイプから選ぶ:

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

pop clip-path

pop defs

pop gradient

pop graphic-context

pop pattern

push clip-path "name"

push defs

push gradient id linear x,y x1,y1

push gradient id radial xc,cy xf,yf radius

push graphic-context { "id" }

id は任意

push pattern id x,y width,height

rectangle x,y x1,y1

rotate angle

roundrectangle x,y x1,y1 width,height

scale x,y

skewX angle

skewX angle

stop-color color offset

stroke color

stroke-antialias 0 • 1

stroke-dasharray none • numeric-list

stroke-dashoffset offset

stroke-linecap type

次のキャップタイプから選ぶ:

butt
round
square

stroke-linejoin type

次のジョインタイプから選ぶ:

bevel
miter
round

stroke-miterlimit limit

stroke-opacity opacity

不透明度は 0.0(完全透明)〜1.0(完全不透明)、またはパーセント(例: 50%)。

stroke-width width

text "text"

text-antialias 0 • 1

text-undercolor color

translate x,y

use "url(#id)"

viewbox x,y x1,y1

なお、プリミティブは大文字小文字を区別します。たとえば viewBox ではなく viewbox を使ってください。