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

ImageMagick 使用例 -- 画像への注釈付け

ImageMagick 使用例 序文と索引
画像のラベリング (画像にラベルを付けるテクニック)

この文書では、大きな画像にテキストや別の画像で注釈を付けるさまざまな方法を紹介します。注釈は太く目立たせることも、控えめに目立たないようにすることもできます。画像に注釈を付ける理由はさまざまですが、たいていは次のいずれかです。

  • 画像が何についてのものかという情報を画像にマークする。
  • 画像の特定の部分を指し示したり強調したりする。
  • コピー保護の一形態として、著作権表示やロゴを画像に加える。

ImageMagick はこうしたことを行う多くの方法を提供していますが、すべてがマニュアルから自力で見つけやすいわけではありません。このページでは、よく使われる方法を紹介しようとしています。具体的な手法の多くは、ほかの使用例ページでより詳しく解説されています。GIF アニメーションへの注釈付けやウォーターマークに興味がある場合は、まずこの文書に目を通してから、GIF アニメーションへの注釈付け に進むことをおすすめします。


画像への注釈付け

画像にラベルを付けるうえでの基本的な問題は、画像がどんなものであってもテキストが読めるようにすることです。以下では多くの方法を示しますが、そのいくつかはより複雑な作業に拡張できます。これらの例では、ImageMagick のデフォルトフォントに限定して説明しています。目的に応じて、さまざまなフォントやポイントサイズを使うことをおすすめします。

画像の下(または上)にラベルを付ける

IM v6.4.7-1 以降、画像の連結 が位置合わせのために gravity 設定に従うようになったため、ラベルの連結を中央揃えで行えるようになりました。 |

  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]
Splice と Draw は、画像に余白を追加してそこにラベルを描画・注釈できるようにする非常に簡単な方法です。 |

  magick dragon.gif \
          -gravity South   -background Plum   -splice 0x18 \
          -annotate +0+2 'Faerie Dragon'   anno_splice.gif

[IM Output]
同じ方法で画像の上にラベルを描くこともできます。gravity 設定の 'South' を 'North' に置き換えるだけです。簡単ですね! |

  magick dragon.gif \
          -gravity North   -background YellowGreen  -splice 0x18 \
          -annotate +0+2 'Faerie Dragon'   anno_splice2.gif

[IM Output]
"[-draw](https://imagemagick.org/command-line-options/#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](https://imagemagick.org/command-line-options/#stoke)" のフォント設定はフォントの内側と外側の両方に太さを加えるため、その効果は低下します(詳細は Stroke と StrokeWidth を参照)。背景アウトライン付きでフォントを描くより良い方法は、テキストを二度描くことです。 |

  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' フォントよりも、太いフォントのほうがうまく機能します。この技法の詳細については 太いストロークの合成フォント を参照してください。 Dim Box(暗色ボックス)を描く:注釈テキストをより見やすくする、より古典的な方法は、テキストを追加する領域の画像を「暗く」して、その上に反対色でテキストを描くことです。例えば… |

  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](https://imagemagick.org/command-line-options/#gravity)" を使わないことにしました。暗くした矩形は gravity で配置できないためです(これは将来変わるかもしれません)。また、そのサイズと位置は画像と最終的なテキストサイズに依存することがあり、追加の計算が必要になる場合があります。 Undercolor Box(下地色ボックス):背景ボックスを自分で描こうとする代わりに、ImageMagick にボックス上で「下地色(undercolor)」を使わせることができます。テキストの下地色ボックス を参照してください。テキストの「下地色」(ライブラリ API で使われる用語)は、コマンドラインでは "[-undercolor](https://imagemagick.org/command-line-options/#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](https://imagemagick.org/command-line-options/#gravity)" で正しく配置できます。
また、単純な暗色ボックスを使うことに限定されません。代わりに、非常に複雑なフォント画像をあらかじめ用意して(何度も適用できるように)、あるいは画像ごとにその場で用意することができます。ほぼすべての 合成フォント効果 のスタイルが利用できるので、テキストの追加を非常に魅力的でプロフェッショナルなものにできます。自動サイズ調整キャプション:IM v6.3.2 のリリースにより、"[caption:](text.html#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](https://imagemagick.org/command-line-options/#composite)" 画像演算子は、画像をさまざまな方法で他の画像の上に配置するための主要な手段を提供します。これらの方法の詳細は アルファ合成 の使用例ページに記載されています。しかし、画像のアルファ合成を利用する、より高水準な演算子もあります。それらには 画像のレイヤー化 や、この使用例ページのさらに下にある Gravity による画像の配置 が含まれます。compose のデフォルトの合成方法は "Over" で、これはオーバーレイ画像を背景画像の上に重ねるだけで、透明度は期待どおりに扱われます。背景画像はまた、オーバーレイがどこに配置されるか("[-geometry](https://imagemagick.org/command-line-options/#geometry)" オプションを使う)に関係なく、結果の最終サイズを決定します。オーバーレイが中央にあろうと、背景画像の半分はみ出していようと、はるか遠くにあろうと、出力画像は背景画像と同じサイズになります。画像の geometry 位置は "[-gravity](https://imagemagick.org/command-line-options/#gravity)" の影響も受けるので、重ね合わせる画像の配置は 9 つの異なる位置のいずれかを基準として定義できます。下の "画像とテキストの配置" を参照してください。合成オーバーレイの "[-geometry](https://imagemagick.org/command-line-options/#geometry)" に加えて、個々の画像はページまたはキャンバスの情報("[-page](https://imagemagick.org/command-line-options/#page)" や "[-repage](https://imagemagick.org/command-line-options/#repage)" オプションで設定)を持つこともでき、これが画像の最終位置に影響することがあります。ただし、この画像固有の情報は "[-gravity](https://imagemagick.org/command-line-options/#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](https://imagemagick.org/command-line-options/#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](https://imagemagick.org/command-line-options/#tile)" オプションは、"magick composite" コマンドを使った合成操作でのみ機能します。"magick" では、範囲を指定するために "[-size](https://imagemagick.org/command-line-options/#size)" を伴う "[tile:](canvas.html#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" のように特定の引用句を出力しますが、より細かく制御できます。この方法は多くの状況で非常にうまく機能しますが、一般には片方(いずれか)の画像が基本的に黒(またはグレースケール)でほぼ白い背景の場合に限られます。両方の画像に色のついた領域が含まれていると、思いがけない結果になることがあります。言い換えれば、この技法は、印刷またはスキャンされたページの画像のように、白い(または十分に明るい色の)画像上に線画、図表、またはテキストの画像を重ね合わせるのに最適です。


ウォーターマーク

ウォーターマーク(透かし)は重要な作業で、画像がある会社やウェブサイトに属していることを示す手段を提供します。残念ながら、これは何らかの形で画像を損なうことを伴い、画像そのものにとっては不利益になります。ウォーターマークの基本的な目標は次のとおりです。

  • マークは、画像の色が明るくても暗くても、はっきり見えるべきである。
  • 消去するのが難しいべきである。
  • そして、見る人にとってあまり煩わしくないべきである。

これらの要素はすべて互いに相反しており、これがウォーターマークをうまく行うのが難しい理由の一つです。

シンボルによるウォーターマーク

最も単純で最も煩わしいウォーターマークの形の一つは、非常に小さいが特定の画像を、ウォーターマークを付ける画像のどこかに置くだけのものです。ここでは、ウォーターマークを付けたい画像を("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]
画像全体にテキストをタイル状に敷き詰めることもできます。ここでは、コマンドの「パイプライン」を使い、一方の出力を次の入力に渡すことで、中間画像も不要にしています。 |

  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 オプションの使い方 のページを参照してください。 Tiled(タイル状): ウォーターマークを 1 か所に追加するだけでなく、背景画像全体にタイル状に敷き詰めることもできます。gravity の位置指定を "[-tile](https://imagemagick.org/command-line-options/#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 をもっと調整するでしょう。 タイル状の灰色化した Dissolve: これは上記とまったく同じですが、さらに低い 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 による画像とテキストの配置

「Gravity(重力)」をめぐる事情

上で見たように、より大きな画像の中で画像やテキストを配置できることは、他の何にも劣らず重要です。当然ながら、"[-gravity](https://imagemagick.org/command-line-options/#gravity)" 設定はこれの最も重要な側面の一つです。

ImageMagick のメーリングリストで、Tim Hunter はこう宣言しました。
「 Gravity はコツをつかむまであなたを狂わせるだろう。 」

これは私が心から同意する感想です。 Gravity は次の状況でのみ適用されます…

  • "[-crop](https://imagemagick.org/command-line-options/#crop)" や、アルファ合成複数画像のレイヤー合成 を含む)のための画像の "[-geometry](https://imagemagick.org/command-line-options/#geometry)" 位置指定のような、'geometry' に類する設定を伴うあらゆる操作。
  • "[label:](text.html#label)" などのさまざまなテキスト画像ジェネレータによるテキストの行揃え、および "[caption:](text.html#caption)" などのさまざまなテキスト画像ジェネレータによるテキストの行揃えを指定する手段としても使われます。
  • "[-annotate](https://imagemagick.org/command-line-options/#annotate)" テキスト描画演算子も、テキストの配置と行揃えにこれを使います。
  • そして最後に、"[-draw](https://imagemagick.org/command-line-options/#draw)" メソッドの 'text' と "image' メソッドで使われ、それらのメソッドでのみ使われます。

しかし、"[-gravity](https://imagemagick.org/command-line-options/#gravity)" は次のものには使われません

  • "[-mosaic](https://imagemagick.org/command-line-options/#mosaic)"、"[-flatten](https://imagemagick.org/command-line-options/#flatten)"、ほとんどの "[-layers](https://imagemagick.org/command-line-options/#layers)" メソッドなどの、あらゆる画像リストやレイヤー演算子、特に GIF アニメーションでは使われません。これらの操作はすべて、画像を配置するために、より大きな仮想キャンバス上の画像オフセット("[-page](https://imagemagick.org/command-line-options/#page)"、"[-repage](https://imagemagick.org/command-line-options/#repage)" メタデータ設定で設定)を使います。そのようなオフセットは常に画像の仮想キャンバスの左上隅を基準とします。この手法では "[-gravity](https://imagemagick.org/command-line-options/#gravity)" の理解はまったく使われません。
  • その他の "[-draw](https://imagemagick.org/command-line-options/#draw)" メソッドは、配置に "[-gravity](https://imagemagick.org/command-line-options/#gravity)" を使いません。また、IM がこれらの低水準機能で従っている SVG ドラフトでは "[-gravity](https://imagemagick.org/command-line-options/#gravity)" が定義されていないため、今後そうなる可能性も低いでしょう。

これはすべて何を意味するのでしょうか。第一に、そして最も重要なことは、ユーザーが画像の実際のサイズを知る必要なく、画像の端、辺、中心を基準としてオーバーレイのテキストや画像を配置するために "[-geometry](https://imagemagick.org/command-line-options/#geometry)" が使う原点を定義することです。これがその主要な機能です。第二に、その定義された gravity の点を基準として、重ね合わせるオブジェクト(テキストまたは画像)の水平・垂直方向の行揃えを定義します。たとえば 'East' gravity では、テキストや画像は定義された点の右側(右揃え)に配置されます。行揃えは技術的には "[-gravity](https://imagemagick.org/command-line-options/#gravity)" とは別の設定であるべきですが(密接に関連はしているものの)、現在の IM は両方を単一の設定にまとめています。この 2 つの側面を分離し、"justification" 設定が未定義の場合は現在の "[-gravity](https://imagemagick.org/command-line-options/#gravity)" 設定を使うようにフォールバックさせようという動きがあります。もしこれが必要だと感じたら、(メーリングリスト経由で)Cristy にリクエストしてください。十分な数のユーザーが求めれば、いずれ実装されると思います。

Gravity を使った画像の配置

ここに、gravity を使って画像を背景上に配置する例があります。

  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](https://imagemagick.org/command-line-options/#gravity)" 設定に従って行揃えされることに注意してください。つまり、"South" の gravity は、より大きな画像の下部に、ただしその gravity 点よりも上に画像を中央揃えします。これは後でテキストの回転の際にいっそう重要になります。もう一つ覚えておくべきことは、"[-geometry](https://imagemagick.org/command-line-options/#geometry)" 設定で指定された位置が、gravity が画像を配置する位置を基準とする点です。それだけでなく、位置の方向も修正され、位置の方向が内向きになります。たとえば "-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](https://imagemagick.org/command-line-options/#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](https://imagemagick.org/command-line-options/#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](https://imagemagick.org/command-line-options/#compose)" 設定の詳細については アルファ合成 を参照してください。複数の画像を 1 枚の画像に重ね合わせて結合する他の方法については、IM 使用例のセクション 複数画像のレイヤー を参照してください。

Gravity を使ったテキストの配置

これは画像については申し分ありませんが、画像に直接テキストを描く場合はどうでしょうか。実は、画像の場合と同じ基本的な効果が適用されます。上で述べたように、gravity は "[-draw](https://imagemagick.org/command-line-options/#draw)" の 'text' メソッド、あるいはより優れた "[-annotate](https://imagemagick.org/command-line-options/#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]
画像とテキストの配置には一つ非常に重要な違いがあります。何らかの形の "[-gravity](https://imagemagick.org/command-line-options/#gravity)" を定義せずにテキスト文字列を描くと、その文字列はフォントの「ベースライン」を基準として描かれます。 たとえば、実際にこれをやってみましょう… |

  magick rings.jpg -annotate 0 'String' gravity_text_none.jpg

[IM Output]
よく見ると、'String' の 'g' の小さなループ状の尾だけが、結果画像の上端に見えていることがわかります。文字列の残りの部分は背景画像の外側に描かれています。しかし、"[-gravity](https://imagemagick.org/command-line-options/#gravity)" を 'NorthWest' に設定すると、テキストは画像であるかのように配置されます。つまり、フォントによって定義される バウンディングボックスまたは下地色ボックス を基準とします。 たとえば… |

  magick rings.jpg -gravity NorthWest -annotate 0 'String'  gravity_text_nw.jpg

[IM Output]
この区別の理由は、IM のテキスト描画が "SVG" のような他のベクター描画画像フォーマットと互換性を保つようにするためです。これらのフォーマットは gravity を使わないため、gravity を有効にすると、テキスト描画の際にフォントの「ベースライン」やテキストの「開始」点を含むベクターグラフィックスのルールではなく、画像配置と同じルールに従うよう IM に指示することになります。gravity を有効にした後で、それを無効に戻したい場合は、"[-gravity](https://imagemagick.org/command-line-options/#gravity) none" または "[+gravity](https://imagemagick.org/command-line-options/#gravity)" を使ってデフォルトの「gravity なし」設定にリセットできます。 テキストオフセットを適用して、"[-gravity](https://imagemagick.org/command-line-options/#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 つの文字列は 'pointsize' 単位できちんと分離されているのではなく、フォントのベースライン高さだけで分離されているのです。最良の考え方は、自分の画像処理でこの 2 つのモードを混在させないことです。gravity を使うか、使わないか。選択はあなた次第です。 Gravity を使った左端へのテキスト配置 最後の例として、画像の左端の中央に沿って実際に注釈を付ける方法を示します。ここでの問題は、テキストを回転させると、テキストの「ハンドル」を中心に回転する点です。残念ながら、このハンドルはテキストが回転される前に gravity によって設定されるため、「中央揃えのテキスト」に限定しない限り、あまりうまく機能しません。[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**](../static/img/scripts/im_annotation.pl)" をダウンロードしてください)。同じプログラムのシェルスクリプト版 "[**im_annotation**](../static/img/scripts/im_annotation)" と "[**im_annotation_2**](../static/img/scripts/im_annotation_2)" も作成しました。 これを機能させるコツは、まず画像全体を回転させてから center south を使うことです! ナンセンスな解決策ですが、機能します。 |

  magick rings.jpg -rotate -90 \
          -gravity South -annotate +0+2 'String' \
          -rotate 90  gravity_text_left.jpg

[IM Output]
別の方法は、下の Distort を使ったテキストの配置 で示します。

Draw を使ったテキストの配置

上記では「テキストオフセット」を使って "[-gravity](https://imagemagick.org/command-line-options/#gravity)" 点を基準としてテキストを配置しましたが、それが唯一の方法ではありません。もう一つの方法は、"-draw translate" オプションを使ってテキストを配置することです。これには、gravity を使ってテキスト内の配置「ハンドル」を「行揃え」しつつ、gravity 効果なしでテキストを配置できるという利点があります。これらの例では、位置が画像の中心点からどのように適用されるかを示すために、いくつかの補助線(これも gravity の影響を受けません)を追加しました。オフセット付きのテキスト… |

  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]
translation(平行移動)付きのテキスト… |

  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" はその引数の一部としてオフセットを与える必要があるため、コマンドラインから描画テキストを配置するのにより一般的に使われます。しかし、この 2 つの方法は同じ結果を生むものの、テキストの回転も適用されると、まったく異なる結果を生みます。基本的には、アクションが適用される順序によるものです。

回転テキストの描画

描画テキストを配置するには 2 つの別々の方法があります。「テキストオフセット」を使うか、テキストを最終位置に「平行移動(translate)」するかです。この 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]
translation 付きのテキストの回転… |

  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]
これが実際にはほとんどの人が望むものです。とはいえ、オフセットの回転も特殊効果には役立つことがあります。これらの 描画サーフェスのワープ の順序が、与えられた順序とは逆になっていることに注意してください。回転が最初に実行され、平行移動が 2 番目に実行されます。'rotate' と 'translate' のメソッドを逆にすると、通常の「テキストオフセット」と同じ結果、つまり回転したオフセットが得られます。"[-annotate](https://imagemagick.org/command-line-options/#annotate)" 演算子は、「サーフェスのワープ」を行うのではなく、回転を伴うテキスト描画を IM に明示的に依頼することで、回転テキストの配置をより簡単にするために特別に設計されました。回転とオフセットを伴う annotate… |

  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](https://imagemagick.org/command-line-options/#gravity)" 設定が、背景画像上の位置だけでなく、描画されるオーバーレイ画像内の位置も指す点です。IMv7 では、オーバーレイの位置を指す「テキストの行揃え(Text Justification)」が、gravity(背景の位置)とは別の(しかし関連する)設定として追加される予定です。

Distort を使ったテキストの配置

SRT 歪み(Distortion)画像のレイヤー化 と組み合わせて使うのは、画像(または画像内のテキスト)を配置するのに特に良い方法です。基本的に、画像が配置される点と、その点を基準として画像をどのように配置するかの両方を、低水準で完全に制御できます。手始めに、ここでは透明な背景を持つ「テキスト画像」を作成し、単純にその画像を背景画像に「レイヤー化」します。 |

  magick rings.jpg -background none label:'Some Text' \
          -flatten  layer_simple.jpg

[IM Output]
ご覧のとおり、テキストは画像の左上隅に単純に追加されました。distort(layers バリアント)を使って回転させましょう —— 歪ませる画像を限定するための括弧の使い方に注目! |

  magick rings.jpg \( -background none label:'Some Text' \
             +distort SRT 70 \
          \) -flatten  layer_rotate.jpg

[IM Output]
テキストの位置は変わっていないことに注意してください! 起きたのは、distort がテキストを中心点(ハンドル)の周りで回転させただけで、「仮想キャンバス」を基準としてその点は動かなかったということです。したがって、今や大きくなった画像が フラット化 されるとき、その回転点「テキスト画像の中心」は動きませんでした。次のステップはそのハンドルを移動させることですが、これには SRT 歪み のほぼ全引数を使う必要があります。「中心ハンドル」も引き続き使いたいので、いくつかの 画像プロパティのパーセントエスケープ、より具体的には 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]
「レイヤー画像」を移動させるもう一つの方法は、Repage 演算子 を使うことです。特に '!' フラグを使った相対移動です。このハンドルは、レイヤー画像の性質上、左上隅です。SRT 歪み演算子 は、指定されたハンドルを使って画像を平行移動させるだけでなく、それらのハンドルの両方にサブピクセル(浮動小数点)位置を使うこともできます。つまり、ほとんどの他の操作が持つ整数の制約なしに、テキストをサブピクセル単位で任意の位置に歪ませることができます。最後の例は、90 度回転させたテキストを左端に配置することです。回転と配置の中心となるテキストのハンドルは、今回は回転前のテキストの中央下になります。つまり、計算上の位置 '%[fx:w/2],%h' です。背景画像上の位置も、左端の中央 '0,%[fx:h/2]' になるように計算する必要があります。問題は、SRT 歪み演算子 がテキスト画像を歪ませているときに背景画像にアクセスできないことです。解決策は、この位置計算を背景画像が利用可能なときに行い、それを何らかの「個人的な設定」に保存して、それを distort の引数に追加できるようにすることです。この技法は 他の画像から情報を抽出する でより詳しく見ています。さて、これが結果です。まず背景画像上の位置を計算します。次に、テキスト画像を歪ませて、その「ハンドル」もその事前計算された位置に移動させます。 |

  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:' というプレフィックスはこれに適した選択です。パーセントエスケープは純粋に文字列置換として扱われ、実際、Distort オプション全体を文字列として生成することもできます。唯一の問題は、'my:' 設定に対して、設定された後に計算を行えないことです。そのため、計算はすべて事前に行わなければなりません。これは IMv7 で検討される予定で、FX 式が % エスケープ変数を使えるようになります。