著者: Anthony Thyssen, <A.Thyssen@griffith.edu.com>
アノテーション — ImageMagick の例

ImageMagick の例 —
画像へのアノテーション

索引
ImageMagick の例:序文と索引
画像へのラベル付け (画像へのラベル付けテクニック)
画像のオーバーレイ (画像を互いに重ねてオーバーレイおよびマージする)
ウォーターマーキング (著作権保護のための注釈)
テキストと画像の位置合わせ方法
このドキュメントでは、テキストまたはその他の画像を使用して大きな画像に注釈を付けるさまざまな方法を示します。注釈は、大胆で非常に目立つものにも、微妙で隠れたものにもできます。画像に注釈を付ける理由はさまざまですが、通常は次のいずれかです。
  • 画像の内容に関する情報を画像にマークする。
  • 画像のいくつかの側面を指摘または強調する。
  • 著作権またはロゴを画像に追加して、著作権保護とする。
ImageMagick はこれらを行うための多くの方法を提供しますが、すべての手法がマニュアルから独自に簡単に発見できるわけではありません。このページでは、一般的に使用される方法を示します。具体的な方法の多くは、他のサンプルページでより詳細に説明されています。GIF アニメーションに注釈またはウォーターマークを付けることに関心がある場合は、まずこのドキュメントを参照してから、GIF アニメーションへの注釈付けに進んでください。

画像へのアノテーション

画像にラベルを付ける際の基本的な問題は、画像に関係なくテキストが読み取り可能になるようにすることです。以下は多くの方法を示しており、そのいずれもより複雑なタスクを実行するために拡張できます。これらの例では、ImageMagick のデフォルトフォントに限定しています。目的を達成するために適切な異なるフォントとポイントサイズを使用することをお勧めします。

画像の下(または上)へのラベル付け

IM v6.4.7-1 以降では、画像の追加 がアライメントのために重力設定に従うようになったため、中央揃えによるラベルの追加が可能になりました。

  magick dragon.gif   -background Khaki  label:'Faerie Dragon' \
          -gravity Center -append    anno_label.jpg
[IM Output]
画像の順序を変更することで、画像の上にラベルを追加できます。

  magick dragon.gif   -background Orange  label:'Faerie Dragon' \
          +swap  -gravity Center -append    anno_label2.jpg
[IM Output]
スプライスと描画は、画像に追加のスペースを追加してラベルを描画/注釈できるようにする非常に簡単な方法です。

  magick dragon.gif \
          -gravity South   -background Plum   -splice 0x18 \
          -annotate +0+2 'Faerie Dragon'   anno_splice.gif
[IM Output]
同じ方法を使用して、画像の上にラベルを描画できます。重力設定の 'South' を 'North' に置き換えるだけです。簡単です!

  magick dragon.gif \
          -gravity North   -background YellowGreen  -splice 0x18 \
          -annotate +0+2 'Faerie Dragon'   anno_splice2.gif
[IM Output]
"-draw" オペレーターは、より複雑な描画機能の一部でない限り、画像への直接描画には推奨されなくなりました。その他のテキスト描画方法とテクニックの詳細については、「テキストから画像への処理」セクションを参照してください。
Montage を使用したラベル付け ImageMagick の montage コマンドは、ユーザーが画像のディレクトリ全体を表示するためにのみ役立つものとして見過ごされることがよくあります。これは、画像にラベルを追加する非常に簡単な方法を提供します。

  montage -label "Faerie Dragon"  dragon.gif \
          -geometry +0+0 -background Gold anno_montage.jpg
[IM Output]
Montage は画像にフレームなどを追加することもできるため、このラベル付け方法は、画像の単純なラベル付けを超えた多くの追加の可能性を秘めています。

  montage -label "Faerie Dragon" dragon.gif \
          -font Candice -pointsize 15 \
          -frame 5  -geometry +0+0 anno_montage2.jpg
Montage の使用方法の詳細については、「Montage、画像の配列」を参照してください。
[IM Output]
Polaroid を使用したラベル付け Montage を使用する代わりに、Polaroid 画像変換 を使用して、かなり派手なコメント付き画像を生成できます。


magick -caption "Faerie Dragon" dragon.gif -gravity center \ -background black +polaroid anno_polaroid.png
警告:この画像は歪んでおり(湾曲して回転しています)、ある程度のランダム化が含まれているため、回転を無効にしない限り、最終的な画像サイズは異なる場合があります。また、複雑な影と透明効果が含まれているため、PNG形式の画像を使用して結果の画像を保存しました。
[IM Output]
回転によって発生する結果画像の「ぼやけ」を軽減するには、「スーパーサンプリング」テクニックを使用できます。これの例については、「Polaroid 画像変換」を参照してください。

画像そのものの上へのラベル付け...

画像に直接テキストを書く際の課題は、選択した色でテキストが読み取り可能になる保証がないことです。描画される画像は、黒、白、または虹色の色である可能性があります。
輪郭のあるラベル:最も簡単な方法は、テキストと画像を分離するために輪郭付きで文字列を描画することです。しかし、「-stroke」フォント設定はフォントに内側と外側の両方に厚さを加えるため、その有効性が低下します(詳細についてはストロークとストローク幅を参照)。背景の輪郭付きでフォントを描画するより良い方法は、テキストを2回描画することです。

  magick dragon.gif -gravity south \
          -stroke '#000C' -strokewidth 2 -annotate 0 'Faerie Dragon' \
          -stroke  none   -fill white    -annotate 0 'Faerie Dragon' \
          anno_outline.jpg
[IM Output]
ご覧のとおり、機能しますが、あまりうまくいきません。デフォルトの 'Times' または 'Arial' フォントよりも太いフォントの方が効果があります。このテクニックの詳細については、「太いストローク複合フォント」を参照してください。
暗いボックスを描画する:注釈付きのテキストをより見やすくするより古典的な方法は、テキストが追加される領域で画像を「暗く」してから、反対の色でテキストを描画することです。例えば...

  magick dragon.gif \
          -fill '#0008' -draw 'rectangle 5,128,114,145' \
          -fill white   -annotate +10+141 'Faerie Dragon' \
          anno_dim_draw.jpg
[IM Output]
この方法はうまく機能しますが、ご覧のとおり、この例ではテキストを配置するために "-gravity" を使用しないことにしました。暗い長方形は重力では配置できないためです(これは将来変更される可能性があります)。また、そのサイズと位置は画像と最終的なテキストサイズによって異なる場合があり、追加の数学計算が必要になる場合があります。
アンダーカラーボックス:自分で背景ボックスを描画しようとする代わりに、ImageMagick がボックスに「アンダーカラー」を使用するようにさせることができます。テキストアンダーカラーボックスを参照してください。(ライブラリAPIで使用されている)テキスト「アンダーカラー」は、「-undercolor」オプションを使用してコマンドラインで指定できます。

  magick dragon.gif  -fill white  -undercolor '#00000080'  -gravity South \
          -annotate +0+5 ' Faerie Dragon '     anno_undercolor.jpg
[IM Output]
ご覧のとおり、自分で暗いボックスを描画するよりもはるかに簡単ですが、ボックスを少しだけパッドするために、描画されたテキストの先頭と最後に余分なスペースを追加することをお勧めします。
合成されたラベル:より理想的な解決策は、事前にテキスト画像を用意してから、それを画像としてオーバーレイすることです。ここでは、半透明の背景にシンプルなラベルを作成し、それをオーバーレイします。

  magick -background '#00000080' -fill white label:'Faerie Dragon' miff:- |\
    magick composite -gravity south -geometry +0+3 \
              -   dragon.gif   anno_composite.jpg
[IM Output]
この最後のテクニックには、いくつかの明確な利点があります。暗いボックスはラベルに合わせてサイズ変更でき、「-gravity」を使用して正しく配置できます。追加される画像に関する特定の知識や、使用されている描画フォントに関する知識は必要ありません。
また、単純な暗いボックスの使用に限定されません。代わりに、事前に、または画像ごとにその場で、非常に複雑なフォント画像を用意できます。ほぼすべての複合フォント効果スタイルも使用できるため、テキストの追加を非常にエキサイティングでプロフェッショナルな外観にすることができます。自動サイズ調整キャプション:IM v6.3.2 のリリースに伴い、「caption:」は、特定のサイズのボックスに最適なサイズにテキストのサイズを自動的に調整できるようになりました。
しかし、オーバーレイに正しく使用するには、注釈付きの画像の幅を知る必要があります。ここでは、その情報を収集してから、テキストが提供されたスペースに最適にフィットするように自動的にサイズ調整され、折り返しが行われるキャプションを作成してオーバーレイします。

  width=`identify -format %w dragon.gif`; \
  magick -background '#0008' -fill white -gravity center -size ${width}x30 \
          caption:"Faerie Dragons love hot apple pies\!" \
          dragon.gif +swap -gravity south -composite  anno_caption.jpg
[IM Output]
このテクニックは、画像に画像のコメントをオーバーレイするのに理想的ですが、コマンドラインでこれを行うと、古い画像に注釈を付けるのではなく、新しい画像を作成するという独自の課題があります。この問題の解決策については、「ユーザー定義オプションエスケープ」を参照してください。 派手なラベル:最後の例として、見やすくするために、派手なソフトアウトラインフォントを使用して作成されたテキスト文字列をオーバーレイしますが、注釈に長方形のボックスは作成しません。

  magick -size 100x14 xc:none -gravity center \
          -stroke black -strokewidth 2 -annotate 0 'Faerie Dragon' \
          -background none -shadow 100x3+0+0 +repage \
          -stroke none -fill white     -annotate 0 'Faerie Dragon' \
          dragon.gif  +swap -gravity south -geometry +0-3 \
          -composite  anno_fancy.jpg
[IM Output]
同じラベル(たとえば、著作権メッセージ)を多数の画像に合成する予定がある場合は、ラベルを個別に生成し、「mogrify」コマンドを使用して各画像にそのラベルを合成する方がおそらく良いでしょう。上記の "-geometry +0-3" オフセットは、この画像のソフトファジーアウトラインが必要以上に大きいことが多いため、合成オーバーレイの位置をエッジにより近づけるために使用されます。
上記の例はすべて、独自の要件に合わせて調整する必要があります。他の人と同じことをする羊にならないでください。実験して、独自のウェブサイトやプログラムに他の人とは異なる個性を与えましょう。そして、さらに重要なこととして、IM コミュニティにそれについて知らせましょう。
FUTURE: select the black or white color based on the images relative
intensity.  This uses a number if very advanced techniques.

  magick input.jpg  -font myfont -pointsize 25 \
      \( +clone -resize 1x1  -fx 1-intensity -threshold 50% \
         -scale 32x32 -write mpr:color +delete \)  -tile mpr:color \
       -annotate +10+26 'My Text'              output.jpg

Explanation:  Copy of image is resized to 1 pixel to find the images
average color.  This is then inverted and greyscaled using -fx, then
thresholded to either black or white, (as appropriate).
This single color pixel is now scaled to a larger tiling image, and
saved into a named memory register (mpr:).

The image is then used to set the fill tile, for the annotated text.
Their is however no simple method (at this time) to set the outline -stroke
color of the draw text to its inverse.

Other techniques are to use some text as a 'negate image' mask, or even a color
burn or color dodge compose operation, to distort the image with the text.


画像のオーバーレイ

ImageMagick の "magick composite" コマンドと "-composite" 画像演算子は、様々な方法で画像を他の画像の上に配置する主要な手段を提供します。これらの方法の詳細については、アルファ合成の例を参照してください。ただし、画像のアルファ合成を利用するさらに高度な演算子もあります。これらには、画像のレイヤリングと、この例ページの下部にある重力による画像の位置調整が含まれます。compose のデフォルトの合成方法は "Over" で、これはオーバーレイ画像を背景画像の上に重ねるだけで、透過処理も期待通りに行われます。"-geometry" オプションを使用してオーバーレイの位置を指定しても、背景画像は最終的な結果のサイズを決定します。オーバーレイが中央にあるか、背景画像からはみ出しているか、遠く離れているかに関係なく、出力画像は背景画像と同じサイズになります。画像のジオメトリ位置は "-gravity" にも影響されるため、重ねられた画像の位置を9つの異なる場所のいずれかに対して定義できます。「画像とテキストの位置調整」を参照してください。"-geometry"に加えて、個々の画像にはページまたはキャンバスの情報("-page" と "-repage" オプションを使用して設定)があり、画像の最終的な位置に影響を与える可能性があります。ただし、この画像固有の情報は "-gravity" の影響を受けません。それでは例を見ていきましょう…オーバーレイは、おそらく最も一般的な画像注釈の方法であり、非常に簡単です。ここでは、準備済みのボタンフレームの中央に、32x32ピクセルの城のアイコンを重ねています。

  magick composite -gravity center  castle.gif  frame.gif  castle_button.gif
[IM Output]  + [IM Output] ==> [IM Output]
サブ画像の位置も正確に指定できます。ここでは、妖精のドラゴンの小さな這い回る部分を指さす手を配置します。

  magick composite -geometry +31+105  hand_point.gif dragon.gif \
            dragon_claw_pointed.jpg
[IM Output]  + [IM Output] ==> [IM Output]
画像が背景にどのように描画されるかは、"-compose" 設定によって制御されます。上記で使用されているデフォルトは "-compose over" で、これは画像を背景に重ねるだけです。提供されている他の合成方法のほとんどは、非常に特殊な状況を除いてあまり使いやすくありませんが、いくつか例を示します。この設定とその効果の詳細については、アルファ合成を参照してください。Bumpmap はトリッキーな合成方法であり、基本的にオーバーレイ画像の明るさに応じて背景画像を暗くします。オーバーレイで白くなっている部分は透明として処理され、黒くなっている部分は出力画像で黒になります。それはインクスタンプのようにオーバーレイを使用するようなものであり、この操作を想像するのに良い方法です。ヒントとして、Bumpmapによるオーバーレイは、明るい色の画像で最も効果を発揮します。そのため、使用する前にBumpmap画像を準備する必要があるかもしれません。ここでは、"-compose bumpmap" を使用して紙巻きの画像に描画する前に、ドラゴンの画像のサイズを変更しています。

  magick composite \( dragon.gif -resize 50% \) scroll.gif \
            -compose bumpmap -gravity center   dragon_scroll.gif
[IM Output]  + [IM Output] ==> [IM Output]
Bumpmapは、画像全体に効果を与えるためにも使用できます。この例では、ドラゴンの上に明るい色の背景パターンをタイル状に配置しています。Bumpmap画像はグレースケール画像として扱われるため、オーバーレイ画像の色は失われることに注意してください。

  magick composite -compose bumpmap  -tile rings.jpg \
            dragon.gif  dragon_rings.jpg
[IM Output]  + [IM Output] ==> [IM Output]
上記の "-tile" オプションは、"magick composite" コマンドを使用する合成操作でのみ機能します。"magick" では、範囲を指定する "-size" と共に "tile:" 画像ジェネレータを使用する必要があります。もちろん、オーバーレイする背景画像よりもソース画像のオーバーレイを大きくすることもできます。結果は背景画像または出力画像のサイズになります。
Multiply 合成方法は、白い背景を持つ2つの画像(テキストのページなど)をマージする能力で最もよく知られています。'bumpmap' 合成方法とは異なり、オーバーレイ画像をグレースケールに変換しません。

  mesgs PictureWords |\
      magick -pointsize 18 text:-  -trim +repage \
              -bordercolor white -border 10x5   text.gif
  magick composite -compose multiply -geometry +400+3 \
            paint_brush.gif  text.gif  text_multiply.gif
[IM Output]  + [IM Output] ==> [IM Output]
補足:「text.gif」を生成する複雑なコマンドは、単なるテキストだけの画像を作成するためのものであり、「mesgs」コマンドは「fortune」のように特定の引用句を出力しますが、より多くの制御が可能です。この方法は多くの状況で非常にうまく機能しますが、一般的にはどちらかの画像が主に白い背景に基本的に黒(またはグレースケール)の場合のみです。両方の画像に色の領域が含まれている場合、予期しない結果になる可能性があります。言い換えれば、このテクニックは、印刷またはスキャンされたページの画像など、白い(または比較的明るい色の)画像に線画、図、またはテキストの画像を重ねるのに最適です。

透かし

透かしは、画像が特定の会社またはウェブサイトに属することを示す方法を提供するため、重要な作業です。残念ながら、これには何らかの形で画像を損なうことが含まれ、画像自体に悪影響を及ぼします。透かしの基本的な目標は次のとおりです。
  • 画像の色が明るいか暗いかにかかわらず、マークがはっきりと見えること。
  • 消去が困難であること。
  • 視聴者にとってあまり煩わしくないこと。
これらの要素はすべて相反しており、透かしをうまく作成することが難しい理由の1つです。

シンボルを使ったウォーターマーキング

最も簡単で、最も煩わしい透かしの1つは、透かしを入れる画像のどこかに非常に小さく具体的な画像を配置することです。ここでは、「logo:」を使用して生成した、小さな「目」記号を使用した透かしを入れたい画像を生成しました。

  magick logo: -resize x180  -gravity center  -crop 180x180+0+0  logo.jpg
  magick composite -geometry +160+13 eyes.gif   logo.jpg  wmark_symbol.jpg
[IM Output]  + [IM Output] ==> [IM Output]
小さな画像を配置する最適なアイデアは、実際には元の画像の一部のように見えるように追加することです。上記では、「目」の画像を魔法使いの帽子の一部のように見えるように追加しました(画像に統合されすぎないようにする必要があります)。したがって、このテクニックは人間のタッチを必要とするため、完全に自動化することは不可能です。小さな画像は、重ねられた画像の部分を完全に破壊するため、削除も非常に困難です。そして、うまく行われた場合、特に探さない限り、ほとんど目立ちません。私はウェブの多くの場所でそれが効果的に使用されているのを見ました。あるウェブサイトでは、小さな短剣のような記号を使用していました。そのウェブサイトから盗まれた画像は、他のウェブサイトで見つけた画像に同じ短剣記号を発見したとき、非常に明白になりました。

テキストによる透かし

画像にテキストを描画するのも、透かしを入れる簡単な方法であり、上記の画像へのラベル付けの例は、透かしの一種として使用できます。ただし、これを実行するには、異なる色の背景に描画されたときにテキストが消えないように、2つの異なる色を使用する必要があります。そのため、何らかの複合フォント効果を使用する必要があります。

  magick logo.jpg  -font Arial -pointsize 20 \
          -draw "gravity south \
                 fill black  text 0,12 'Copyright' \
                 fill white  text 1,11 'Copyright' " \
          wmark_text_drawn.jpg
これはうまく機能し、自動化できますが、画像から際立ちすぎるため、優れた透かしとしては大胆すぎます。
[IM Output]
しかし、準備をすることで、目立たない透過背景の画像を作成できます。透かしテキストの生成に使用されている手順の詳細については、フォントのマスキングを参照してください。画像のマスキングのマスキングの例も理解に役立つ場合があります。

  magick -size 300x50 xc:grey30 -font Arial -pointsize 20 -gravity center \
          -draw "fill grey70  text 0,0  'Copyright'" \
          stamp_fgnd.png
  magick -size 300x50 xc:black -font Arial -pointsize 20 -gravity center \
          -draw "fill white  text  1,1  'Copyright'  \
                             text  0,0  'Copyright'  \
                 fill black  text -1,-1 'Copyright'" \
          -alpha off stamp_mask.png
  magick composite -compose CopyOpacity  stamp_mask.png  stamp_fgnd.png  stamp.png
  magick mogrify -trim +repage stamp.png
[IM Output]
これで、画像に適用できる透かしフォントができました…

  magick composite -gravity south -geometry +0+10 stamp.png  logo.jpg \
            wmark_text_stamped.jpg
ご覧のとおり、透かしは以前ほど大胆ではなく、純粋な白黒ではなく、グレーの色合いも使用しています。それでも、背景が何であっても非常に目立ちます。複合フォント効果ページには、透かしを入れる画像を圧倒することなく、この方法で使用できる多くのフォントスタイルが詳細に説明されています。
[IM Output]
テキストを画像全体にタイル状に並べることもできます。ここでは、コマンドの「パイプライン」を使用して中間画像の必要性を回避し、1つの出力から次の出力にフィードします。

  magick -size 140x80 xc:none -fill grey \
          -gravity NorthWest -draw "text 10,10 'Copyright'" \
          -gravity SouthEast -draw "text 5,15 'Copyright'" \
          miff:- |\
    magick composite -tile - logo.jpg  wmark_text_tiled.jpg
これは、画像(図ではなく写真など)には、タイル状に配置されたテスト文字列が見える領域が一般的にあるという事実を利用しています。独自の透かしのためにテキストを半透明にする(たとえば、「'#80808080'」などの半透明のグレーを使用する)ことをお勧めします。また、次の適切な透かしテクニックでこのタイルテクニックを考慮に入れてください。
[IM Output]

画像を使ったウォーターマーキング

ImageMagickは、より広い領域に適用する、より微妙な透かしに特に役立つ多くのオプションも提供します。これは通常、「画像に透かしを入れる」場合に一般的に言及されるものです。右側に、これらのデモンストレーションに使用される「ウォータードラゴン」画像があります。これには透過性があり、IMが透過性に関して正しい処理を行い、結果にひどい「正方形」の外観を避けるために使用しました。 [IM Output]
IMバージョン6より前では、「-watermark」と「-dissolve」オプションは、オーバーレイ画像のアルファチャンネル(透過性)の処理において破損しており、非常に奇妙な効果を生み出していました。
Watermark 合成は画像に透かしを入れることを目的としていましたが、機能するものの、純粋な白黒のオーバーレイ画像でのみ機能し、醜いエッジアーティファクトを生み出す傾向があります。

  magick composite -watermark 30% -gravity south \
            wmark_image.png  logo.jpg    wmark_watermark.jpg
このオプションの詳細については、Watermark オプションの使用ページを参照してください。
[IM Output]
Dissolve は、私や他のユーザーによって機能することがわかりました。

  magick composite -dissolve 25% -gravity south \
            wmark_image.png   logo.jpg  wmark_dissolve.jpg
これは非常にうまく機能しますが、透かしの一部は純粋な白と黒のピクセルを持つ画像では消えてしまいます。つまり、白の上に白を、黒の上に黒を溶かすと、最終画像では見えなくなります。これらの2つの色は非常に一般的であるため、透かしを事前に処理して、純粋な白黒ではなく様々なグレーの色合いを使用することをお勧めします。(以下の「グレー化されたDissolve」を参照)
[IM Output]
このオプションの詳細については、Dissolve オプションの使用ページを参照してください。
タイル状: 透かしを1か所に追加するのではなく、背景画像全体にタイル状に並べることもできます。重力位置を "-tile" に置き換えるだけです。もちろん、その場合は透かしをさらに目立たなくしたいでしょう。

  magick composite -dissolve 15 -tile \
            wmark_image.png   logo.jpg  wmark_tiled.jpg
[IM Output]
グレー化されたBumpmap: Bumpmapを透かしとして適切に使用するには、グレースケール調整テクニックを使用して、白と黒の両方をより明るいグレーの色域にするための準備が必要です。これを行わないと、結果は非常に大胆になります。

  magick wmark_image.png  -fill Gray91 -colorize 80  miff:- |\
  magick composite -compose bumpmap -gravity south \
            -  logo.jpg    wmark_bumpmap.jpg
[IM Output]
透かしとしてのBumpmapの最大の問題は、操作によって画像が暗くなるだけであることです。そのため、このテクニックは非常に暗い画像にはほとんど役に立ちません。
グレー化されたDissolve: 同じ前処理テクニックは、Dissolveメソッドにも役立ちます。これにより、透かしの白い部分が白い背景でわずかに暗くなり、同様に透かしの黒い部分が画像の黒い部分でわずかに明るくなります。

  magick wmark_image.png  -fill grey50 -colorize 40  miff:- |\
  magick composite -dissolve 30 -gravity south -  logo.jpg wmark_dissolve_grey.jpg
[IM Output]
これは、すべての要件を満たす透かしとしてほぼ理想的と言えるでしょう。ただし、透かしをさらに目立たなくするために、最終的な溶解度をさらに調整します。
タイル状グレー化されたDissolve: 上記とまったく同じですが、さらに低い溶解度値で画像全体にタイル状に配置されています。

  magick wmark_image.png  -fill grey50 -colorize 40  miff:- |\
  magick composite -dissolve 15 -tile  -  logo.jpg wmark_dissolve_tile.jpg
[IM Output]
"magick composite" コマンドは、アニメーションなどの複数画像ファイルの処理方法を認識していません。ただし、他の方法でもこれを行うことができます。複数画像ファイルへの注釈とオーバーレイの例については、アニメーションの変更、注釈を参照してください。

重力による画像とテキストの位置調整

状況の「重力」

上記のように、大きな画像内に画像とテキストを配置できることは、他のあらゆることと同じくらい重要です。「-gravity」設定はこの中で最も重要な側面の1つです。
ImageMagickメーリングリストで、Tim Hunterは次のように述べています。
Gravityは、使いこなせるようになるまであなたを狂気に陥れます。
この意見に私は心から同意します。
Gravityは、以下の状況でのみ適用されます…
  • -crop」や「-geometry」など、「geometry」のような設定を含むすべての操作。 アルファ合成複数画像のレイヤード合成を含みます。
  • また、「label:」や「caption:」などの様々なテキスト画像生成ツールによるテキストの揃え方を指定する手段としても使用されます。
  • -annotate」テキスト描画演算子も、テキストの配置と揃え方に使用されます。
  • そして最後に、「-draw」メソッドの「text」と「image」メソッドでのみ使用されます。
しかし「-gravity」は、使用されません
  • -mosaic」、「-flatten」、そしてほとんどの「-layers」メソッド、特にGIFアニメーションでは使用されません。これらの操作はすべて、より大きな仮想キャンバス(「-page」、「-repage」メタデータ設定を使用して設定)上の画像オフセットを使用して画像を配置します。このようなオフセットは、常に画像の仮想キャンバスの左上隅を基準にしています。「-gravity」の理解はこの方法論では使用されません。
  • 他の「-draw」メソッドは、配置に「-gravity」を使用しません。IMがこれらの低レベル関数に対して従うSVGドラフトでは「-gravity」が定義されていないため、そうする可能性も低いでしょう。
これは何を意味するのでしょうか?まず第一に、ユーザーが画像の実際のサイズを知る必要なく、オーバーレイテキストと画像を画像のエッジ、側面、中央に対して配置するために「-geometry」が使用する原点を定義します。これはその主要な機能です。第二に、定義された重力点に対するオーバーレイオブジェクト(テキストまたは画像)の水平方向と垂直方向の揃え方を定義します。たとえば、「East」の重力では、テキストまたは画像は定義された点の右側に(右揃えで)配置されます。揃え方は技術的には「-gravity」とは別設定であるべきですが、密接に関連しているため、IMは現在両方を単一の設置にまとめています。「justification」設定が未定義の場合、現在の「-gravity」設定に戻ることが求められています。必要な場合は、(メーリングリスト経由で)Cristyにリクエストしてください。十分なユーザーが要求すれば、最終的には実装されるでしょう。

重力を使った画像の位置合わせ

ここでは、重力を使用して背景に画像を配置する例を示します。

  magick composite label:Default                      rings.jpg gravity_default.jpg
  magick composite label:Center    -gravity center    rings.jpg gravity_center.jpg
  magick composite label:South     -gravity south     rings.jpg gravity_south.jpg
  magick composite label:East      -gravity east      rings.jpg gravity_east.jpg
  magick composite label:NorthEast -gravity northeast rings.jpg gravity_northeast.jpg
[IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
画像の実際の位置は、「-gravity」設定に従って揃えられます。つまり、「South」の重力では、画像が大きな画像の一番下に中央に配置されますが、その重力点の上になります。これは、後でテキストの回転でより重要になります。もう1つ覚えておくべきことは、「-geometry」設定で指定された位置は、重力が画像を配置する位置を基準にしていることです。それだけでなく、位置の方向も変更されるため、位置方向は内向きになります。例えば、「-gravity South -geometry +10+10」は、ラベル画像を背景にもっと深く移動します。つまり、geometry位置のY方向は反転し、X方向はそのままです。

  magick composite label:Default   -geometry +10+10 \
            rings.jpg gravity_default_pos.jpg
  magick composite label:South     -geometry +10+10 -gravity south \
            rings.jpg gravity_south_pos.jpg
  magick composite label:NorthEast -geometry +10+10 -gravity northeast \
            rings.jpg gravity_northeast_pos.jpg
[IM Output] [IM Output] [IM Output]
-gravity」を「-draw image」と共に使用して、単一のコマンドで複数の画像を処理することもできます。

  magick rings.jpg \
          -gravity Center     -draw "image Over     0,0 0,0 'castle.gif'" \
          -gravity NorthEast  -draw "image Bumpmap  0,0 0,0 'castle.gif'" \
          -gravity SouthWest  -draw "image Multiply 0,0 0,0 'castle.gif'" \
          gravity_image.jpg
[IM Output]
また、現在「-composite」を使用して、画像を背景にオーバーレイすることもできます…

  magick rings.jpg \
          -gravity Center     castle.gif  -compose Over     -composite \
          -gravity NorthWest  castle.gif  -compose Bumpmap  -composite \
          -gravity SouthEast  castle.gif  -compose Multiply -composite \
          gravity_image2.jpg
[IM Output]
上記で使用されている「-compose」設定の詳細については、アルファ合成を参照してください。複数の画像を1つの画像にオーバーレイおよび結合するその他の方法については、IMの例セクション複数画像のレイヤーを参照してください。

重力を使用したテキストの配置

画像についてはそれで良いのですが、画像に直接テキストを描画することについてはどうでしょうか。画像の場合と同様に、基本的な効果は同じです。上記のように、重力は「-draw」の「text」メソッド、またはより優れた「-annotate」テキスト描画演算子を使用してテキストの配置にも影響します。

  magick rings.jpg -resize 120x120  \
          -gravity northwest  -annotate 0 'NorthWest' \
          -gravity east       -annotate 0 'East' \
          -gravity center     -annotate 0 'Center' \
          -gravity south      -annotate 0 'South' \
          -gravity northeast  -annotate 0 'NorthEast' \
          gravity_text.jpg
[IM Output]
画像とテキストの配置には、非常に重要な違いが1つあります。「-gravity」を定義せずにテキスト文字列を描画すると、文字列はフォントの「ベースライン」を基準に描画されます。
例えば、実際にやってみましょう…

  magick rings.jpg -annotate 0 'String' gravity_text_none.jpg
[IM Output]
注意深く見ると、「String」の「g」の小さなループテールだけが結果画像の上端に表示されていることがわかります。文字列の残りは背景画像の外側に描画されています。しかし、「-gravity」を「NorthWest」に設定すると、テキストは画像のように配置されます。つまり、フォントによって定義されたバウンディングボックスまたはアンダーカラーボックスを基準に配置されます。
例えば…

  magick rings.jpg -gravity NorthWest -annotate 0 'String'  gravity_text_nw.jpg
[IM Output]
この区別は、IMのテキスト描画が「SVG」のような他のベクター描画画像形式と互換性を維持できるようにするためです。これらの形式は重力を使用しないため、重力をオンにすると、フォントの「ベースライン」とテキストの「開始」点を含むベクターグラフィックスルールではなく、画像配置と同じルールに従うようにIMに指示します。重力をオンにしてから後でオフにしたい場合は、「-gravity none」または「+gravity」を使用して、デフォルトの「重力なし」設定に戻すことができます。
テキストオフセットを適用し、「-gravity」のデフォルトの「None」と「NorthWest」の引数を両方描画して、2つの形式がどれほど密接に関連しているかを確認してみましょう。

  magick rings.jpg \
          -gravity NorthWest -annotate +10+20 'NorthWest' \
          -gravity None      -annotate +10+20 'None' \
          gravity_text_pos.jpg
[IM Output]
この例ではそう見えないかもしれませんが、これらの2つの文字列は、特に「g」や「p」などの文字のディセンダーに関して、重複する可能性があります。これは、2つの文字列が「ポイントサイズ」単位で適切に区切られていないためであり、フォントのベースラインの高さだけで区切られているためです。自分の画像処理では、2つのモードを混ぜないのが最善です。重力を使用するか、使用しないかを選択できます。

重力を使用した左端のテキスト

最後の例として、画像の左端の中央に注釈を付ける方法を示します。ここでの問題は、テキストを回転させると、テキストの「ハンドル」を中心に回転することです。残念ながら、このハンドルはテキストが回転する前に重力によって設定されるため、特に「中央揃えのテキスト」を使用しない限り、うまく機能しません。[IM Output]
例えば、テキストを画像の左端の中央に配置しようとする典型的な「最初の試み」です。もちろん、予想外に失敗します!
 magick rings.jpg \ -gravity West -annotate 90x90+10+0 'String' \ gravity_text_left_fail.jpg 
ご覧のとおり、テキストは左端に配置されましたが、開始位置(回転前の「ハンドル」がある場所)が中央に配置されるだけです。この問題の原因は、IMv7では「
-gravity」設定がテキストの「揃え方」(テキストの位置を設定するために使用される「ハンドル」を設定する)の直接設定にも使用されることです。「gravity」の効果を回転テキストに与えるアニメーションデモがPerlMagick APIでいくつか作成されています(「im_annotation.pl」をダウンロードしてください)。また、同じプログラムのシェルスクリプトバージョン「im_annotation」と「im_annotation_2」も作成しました。
これを機能させるためのトリックは、最初に画像全体を回転してから、中央南を使用することです。ナンセンスな解決策ですが、機能します。

  magick rings.jpg -rotate -90 \
          -gravity South -annotate +0+2 'String' \
          -rotate 90  gravity_text_left.jpg
[IM Output]
歪みを使用したテキストの配置に、別の方法を示します。

Drawを使ったテキストの位置合わせ

上記では、「-gravity」点を基準にテキストを配置するために「テキストオフセット」を使用しましたが、それは唯一の方法ではありません。もう1つの方法は、「-draw translate」オプションを使用してテキストを配置することです。これには、重力効果を使用せずにテキストを配置しながら、重力を使用してテキスト内の配置「ハンドル」を「揃える」ことができるという利点があります。これらの例では、追加の構成線(これも重力の影響を受けません)を追加して、画像の中心点から位置がどのように適用されるかを示しました。オフセット付きのテキスト…

  magick -size 100x100 xc:white -gravity Center \
          -fill cyan  -draw 'line 50,50 70,70' \
          -fill red   -draw 'line 68,70 72,70 line 70,68 70,72' \
          -fill blue  -draw "text 20,20 'Offset'" \
          text_offset.jpg
[IM Output]
変換付きのテキスト…

  magick -size 100x100 xc:white -gravity Center \
          -fill cyan -draw 'line 50,50 70,70' \
          -fill red  -draw 'line 68,70 72,70  line 70,68 70,72' \
          -fill blue -draw "translate 20,20 text 0,0 'Translate'" \
          text_translate.jpg
[IM Output]
ご覧のとおり、どちらも同じ効果的な結果をもたらします。しかし、「-draw text」では、引数の1部であるオフセットを指定する必要があるため、コマンドラインから描画テキストを配置するためにより一般的に使用されます。しかし、これらの両方の方法が同じ結果をもたらす場合でも、テキストの回転も適用すると、完全に異なる結果が生成されます。基本的に、アクションが適用される順序が原因です。

回転テキストを描画する

描画されたテキストを配置する方法は2つあります。「テキストオフセット」を使用するか、テキストを最終位置に「変換」します。これらの2つの配置方法の効果は、回転も適用すると非常に異なる結果になります。その理由は複雑ですが、本質的にはIMが描画サーフェスのワープを行う方法に関係しています。そうは言っても、2つの異なる位置を使用してテキストを回転した場合に何が起こるかを見てみましょう。回転のないオフセットのみ…

  magick -size 100x100 xc:white -gravity Center \
          -fill cyan -draw 'line 50,50 70,70' \
          -fill red  -draw 'line 68,70 72,70  line 70,68 70,72' \
          -fill blue -draw "text 20,20 'None'" \
          rotate_none.jpg
[IM Output]
オフセット付きのテキストの回転…

  magick -size 100x100 xc:white -gravity Center \
          -fill cyan -draw 'line 50,50 50,78' \
          -fill red  -draw 'line 48,78 52,78  line 50,76 50,80' \
          -fill blue -draw "rotate 45 text 20,20 'Offset'" \
          rotate_offset.jpg
[IM Output]
変換付きのテキストの回転…

  magick -size 100x100 xc:white -gravity Center \
          -fill cyan -draw 'line 50,50 70,70' \
          -fill red  -draw 'line 68,70 72,70  line 70,68 70,72' \
          -fill blue -draw "translate 20,20 rotate 45 text 0,0 'Translate'" \
          rotate_translate.jpg
[IM Output]
これは実際にはほとんどの人が望むものです。ただし、オフセット回転は、特殊効果に役立つ場合があります。これらの描画サーフェスのワープの順序が、与えられた順序とは逆になっていることに注意してください。回転が最初に実行され、変換が次に実行されます。「rotate」と「translate」の方法を逆順にすると、通常の「テキストオフセット」、つまり回転されたオフセットと同じ結果が得られます。「-annotate」演算子は、特にIMに回転させてテキストを描画するように指示することで、「サーフェスのワープ」を行うのではなく、回転テキストの配置を容易にするために特別に設計されました。回転とオフセットによるアノテーション…

  magick -size 100x100 xc:white -gravity Center \
          -fill cyan -draw 'line 50,50 70,70' \
          -fill red  -draw 'line 68,70 72,70  line 70,68 70,72' \
          -fill blue -annotate 45x45+20+20 'Annotate' \
          rotate_annotate.jpg
[IM Output]
上記の例の問題点は、IMv7の "-gravity" 設定が、背景画像上の位置だけでなく、描画されるオーバーレイ画像上の位置も参照することです。IMv7では、オーバーレイの位置を参照する「テキストの揃え方」が、グラビティ(背景の位置)とは別の(しかし関連する)設定として追加されます。

Distortを使ったテキストの位置合わせ

SRT歪み画像のレイヤリングを使用することは、画像(または画像内のテキスト)を配置するための特に優れた方法です。基本的に、画像が配置されるポイントと、そのポイントを基準とした画像の配置方法の両方について、完全な低レベル制御を可能にします。まず、透明な背景を持つ「テキスト画像」を作成し、その画像を背景画像に単純に「レイヤー」します。

  magick rings.jpg -background none label:'Some Text' \
          -flatten  layer_simple.jpg
[IM Output]
ご覧のように、テキストは画像の左上に追加されるだけです。歪み(レイヤのバリアント)を使用して回転させてみましょう -- 歪ませる画像を制限するために括弧を使用することに注意してください!

  magick rings.jpg \( -background none label:'Some Text' \
             +distort SRT 70 \
          \) -flatten  layer_rotate.jpg
[IM Output]
テキストの位置は変更されなかったことに注意してください!起こったことは、歪みが中心点(ハンドル)を中心にテキストを回転させたことだけです。しかし、「仮想キャンバス」に対してその点は移動しませんでした。したがって、サイズが大きくなった画像がフラット化されると、回転の中心点「テキスト画像の中心」は移動しません。次のステップはそのハンドルを移動することですが、そのためにはSRT歪み引数のほぼすべてを使用する必要があります。引き続き「中心ハンドル」も使用したいので、ImageMagickのプロパティパーセントエスケープ、より具体的にはFXパーセントエスケープを使用する必要があります。そこで、中心点を背景画像の「+60+60」に配置してみましょう。

  magick rings.jpg \( -background none label:'Some Text' \
             +distort SRT '%[fx:w/2],%[fx:h/2] 1 70 60,60' \
          \) -flatten  layer_translate.jpg
[IM Output]
「レイヤー画像」を移動する別の方法は、リページ演算子を使用することです。特に「!」フラグを使用した相対移動です。これの「ハンドル」は、レイヤー画像の性質上、左上隅です。SRT歪み演算子は、指定されたハンドルを使用して画像を移動するだけでなく、それらのハンドルの両方にサブピクセル(浮動小数点)の位置を使用できます。つまり、ほとんどの他の操作が持つ整数制限なしに、サブピクセル単位で任意の場所にテキストを歪ませることができます。最後の例は、90度回転したテキストを左端に配置することです。回転して位置合わせするテキストのハンドルは、今回はテキストの中央下部になります(回転前)。つまり、「%[fx:w/2],%h」という計算された位置です。背景画像上の位置も、中心左端(「0,%[fx:h/2]」)に計算する必要があります。問題は、SRT歪み演算子がテキスト画像を歪ませているときに背景画像にアクセスできないことです。解決策は、背景画像が利用可能なときにこの位置計算を行い、それをいくつかの「個人設定」に保存し、それを歪み引数に追加することです。このテクニックについては、他の画像から情報を抽出するで詳しく見ていきます。これが結果です。まず、背景画像上の位置を計算します。次に、その「ハンドル」も事前に計算された位置に移動するようにテキスト画像を歪ませます。

  magick rings.jpg -set option:my:left_edge '0,%[fx:h/2]' \
          \( -background none label:'Some Text' \
             +distort SRT '%[fx:w/2],%h 1 90 %[my:left_edge]' \
          \) -flatten  layer_on_left.jpg
[IM Output]
my:」文字列は、既存のプレフィックスと衝突しないものであれば何でもかまいません。つまり、私はImageMagickがコーダーまたは特定のオプションに使用できる他の設定とは別に、自分の設定を保持するために使用しています。「my:」をプレフィックスとして付けるのは、そのためには良い選択です。パーセントエスケープは純粋に文字列置換として処理され、実際には歪みオプション全体を文字列として生成できます。唯一の問題は、「my:」設定を設定した後で、それらの設定に対して数学演算を実行できないことです。したがって、すべての数学演算は事前に実行する必要があります。これは、FX式が%エスケープ変数を使用するようにIMv7で検討されるものです。