ImageMagick の例 —
画像へのアノテーション
- 索引
-
ImageMagick の例:序文と索引
-
画像へのラベル付け
(画像へのラベル付けテクニック)
-
画像のオーバーレイ
(画像を互いに重ねてオーバーレイおよびマージする)
-
ウォーターマーキング
(著作権保護のための注釈)
-
テキストと画像の位置合わせ方法
- 画像の内容に関する情報を画像にマークする。
- 画像のいくつかの側面を指摘または強調する。
- 著作権またはロゴを画像に追加して、著作権保護とする。
画像へのアノテーション
画像にラベルを付ける際の基本的な問題は、画像に関係なくテキストが読み取り可能になるようにすることです。以下は多くの方法を示しており、そのいずれもより複雑なタスクを実行するために拡張できます。これらの例では、ImageMagick のデフォルトフォントに限定しています。目的を達成するために適切な異なるフォントとポイントサイズを使用することをお勧めします。画像の下(または上)へのラベル付け
IM v6.4.7-1 以降では、画像の追加 がアライメントのために重力設定に従うようになったため、中央揃えによるラベルの追加が可能になりました。
|
![]() |
画像の順序を変更することで、画像の上にラベルを追加できます。
|
![]() |
スプライスと描画は、画像に追加のスペースを追加してラベルを描画/注釈できるようにする非常に簡単な方法です。
|
![]() |
同じ方法を使用して、画像の上にラベルを描画できます。重力設定の 'South ' を 'North ' に置き換えるだけです。簡単です!
|
![]() |
-draw
" オペレーターは、より複雑な描画機能の一部でない限り、画像への直接描画には推奨されなくなりました。その他のテキスト描画方法とテクニックの詳細については、「テキストから画像への処理」セクションを参照してください。Montage は画像にフレームなどを追加することもできるため、このラベル付け方法は、画像の単純なラベル付けを超えた多くの追加の可能性を秘めています。
|
![]() |
Polaroid を使用したラベル付け Montage を使用する代わりに、Polaroid 画像変換 を使用して、かなり派手なコメント付き画像を生成できます。
|
![]() |
画像そのものの上へのラベル付け...
画像に直接テキストを書く際の課題は、選択した色でテキストが読み取り可能になる保証がないことです。描画される画像は、黒、白、または虹色の色である可能性があります。
輪郭のあるラベル:最も簡単な方法は、テキストと画像を分離するために輪郭付きで文字列を描画することです。しかし、「-stroke 」フォント設定はフォントに内側と外側の両方に厚さを加えるため、その有効性が低下します(詳細についてはストロークとストローク幅を参照)。背景の輪郭付きでフォントを描画するより良い方法は、テキストを2回描画することです。
|
![]() |
Times
' または 'Arial
' フォントよりも太いフォントの方が効果があります。このテクニックの詳細については、「太いストローク複合フォント」を参照してください。
暗いボックスを描画する:注釈付きのテキストをより見やすくするより古典的な方法は、テキストが追加される領域で画像を「暗く」してから、反対の色でテキストを描画することです。例えば...
|
![]() |
-gravity
" を使用しないことにしました。暗い長方形は重力では配置できないためです(これは将来変更される可能性があります)。また、そのサイズと位置は画像と最終的なテキストサイズによって異なる場合があり、追加の数学計算が必要になる場合があります。
アンダーカラーボックス:自分で背景ボックスを描画しようとする代わりに、ImageMagick がボックスに「アンダーカラー」を使用するようにさせることができます。テキストアンダーカラーボックスを参照してください。(ライブラリAPIで使用されている)テキスト「アンダーカラー」は、「-undercolor 」オプションを使用してコマンドラインで指定できます。
|
![]() |
合成されたラベル:より理想的な解決策は、事前にテキスト画像を用意してから、それを画像としてオーバーレイすることです。ここでは、半透明の背景にシンプルなラベルを作成し、それをオーバーレイします。
|
![]() |
-gravity
」を使用して正しく配置できます。追加される画像に関する特定の知識や、使用されている描画フォントに関する知識は必要ありません。また、単純な暗いボックスの使用に限定されません。代わりに、事前に、または画像ごとにその場で、非常に複雑なフォント画像を用意できます。ほぼすべての複合フォント効果スタイルも使用できるため、テキストの追加を非常にエキサイティングでプロフェッショナルな外観にすることができます。自動サイズ調整キャプション:IM v6.3.2 のリリースに伴い、「
caption:
」は、特定のサイズのボックスに最適なサイズにテキストのサイズを自動的に調整できるようになりました。しかし、オーバーレイに正しく使用するには、注釈付きの画像の幅を知る必要があります。ここでは、その情報を収集してから、テキストが提供されたスペースに最適にフィットするように自動的にサイズ調整され、折り返しが行われるキャプションを作成してオーバーレイします。
|
![]() |
|
![]() |
-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ピクセルの城のアイコンを重ねています。サブ画像の位置も正確に指定できます。ここでは、妖精のドラゴンの小さな這い回る部分を指さす手を配置します。画像が背景にどのように描画されるかは、"-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]](../images/dragon.gif)

![[IM Output]](../images/scroll.gif)

![[IM Output]](dragon_scroll.gif)
![]() ![]() |
上記の "-tile " オプションは、"magick composite " コマンドを使用する合成操作でのみ機能します。"magick " では、範囲を指定する "-size " と共に "tile: " 画像ジェネレータを使用する必要があります。もちろん、オーバーレイする背景画像よりもソース画像のオーバーレイを大きくすることもできます。結果は背景画像または出力画像のサイズになります。 |
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]](../images/paint_brush.gif)

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

![[IM Output]](text_multiply.gif)
text.gif
」を生成する複雑なコマンドは、単なるテキストだけの画像を作成するためのものであり、「mesgs
」コマンドは「fortune
」のように特定の引用句を出力しますが、より多くの制御が可能です。この方法は多くの状況で非常にうまく機能しますが、一般的にはどちらかの画像が主に白い背景に基本的に黒(またはグレースケール)の場合のみです。両方の画像に色の領域が含まれている場合、予期しない結果になる可能性があります。言い換えれば、このテクニックは、印刷またはスキャンされたページの画像など、白い(または比較的明るい色の)画像に線画、図、またはテキストの画像を重ねるのに最適です。透かし
透かしは、画像が特定の会社またはウェブサイトに属することを示す方法を提供するため、重要な作業です。残念ながら、これには何らかの形で画像を損なうことが含まれ、画像自体に悪影響を及ぼします。透かしの基本的な目標は次のとおりです。- 画像の色が明るいか暗いかにかかわらず、マークがはっきりと見えること。
- 消去が困難であること。
- 視聴者にとってあまり煩わしくないこと。
シンボルを使ったウォーターマーキング
最も簡単で、最も煩わしい透かしの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]](logo.jpg)

![[IM Output]](../images/eyes.gif)

![[IM Output]](wmark_symbol.jpg)
テキストによる透かし
画像にテキストを描画するのも、透かしを入れる簡単な方法であり、上記の画像へのラベル付けの例は、透かしの一種として使用できます。ただし、これを実行するには、異なる色の背景に描画されたときにテキストが消えないように、2つの異なる色を使用する必要があります。そのため、何らかの複合フォント効果を使用する必要があります。
|
![]() |
|
![[IM Output]](stamp.png)
これで、画像に適用できる透かしフォントができました…
|
![]() |
'#80808080' 」などの半透明のグレーを使用する)ことをお勧めします。また、次の適切な透かしテクニックでこのタイルテクニックを考慮に入れてください。 |
![]() |
画像を使ったウォーターマーキング
ImageMagickは、より広い領域に適用する、より微妙な透かしに特に役立つ多くのオプションも提供します。これは通常、「画像に透かしを入れる」場合に一般的に言及されるものです。右側に、これらのデモンストレーションに使用される「ウォータードラゴン」画像があります。これには透過性があり、IMが透過性に関して正しい処理を行い、結果にひどい「正方形」の外観を避けるために使用しました。 |
![]() |
![]() ![]() |
IMバージョン6より前では、「-watermark 」と「-dissolve 」オプションは、オーバーレイ画像のアルファチャンネル(透過性)の処理において破損しており、非常に奇妙な効果を生み出していました。 |
Watermark 合成は画像に透かしを入れることを目的としていましたが、機能するものの、純粋な白黒のオーバーレイ画像でのみ機能し、醜いエッジアーティファクトを生み出す傾向があります。
|
![]() |
|
Dissolve は、私や他のユーザーによって機能することがわかりました。
|
![]() |
|
タイル状: 透かしを1か所に追加するのではなく、背景画像全体にタイル状に並べることもできます。重力位置を "-tile " に置き換えるだけです。もちろん、その場合は透かしをさらに目立たなくしたいでしょう。
|
![]() |
|
グレー化されたBumpmap: Bumpmapを透かしとして適切に使用するには、グレースケール調整テクニックを使用して、白と黒の両方をより明るいグレーの色域にするための準備が必要です。これを行わないと、結果は非常に大胆になります。
|
![]() |
|
グレー化されたDissolve: 同じ前処理テクニックは、Dissolveメソッドにも役立ちます。これにより、透かしの白い部分が白い背景でわずかに暗くなり、同様に透かしの黒い部分が画像の黒い部分でわずかに明るくなります。
|
![]() |
|
タイル状グレー化されたDissolve: 上記とまったく同じですが、さらに低い溶解度値で画像全体にタイル状に配置されています。
|
![]() |
![]() ![]() |
"magick composite " コマンドは、アニメーションなどの複数画像ファイルの処理方法を認識していません。ただし、他の方法でもこれを行うことができます。複数画像ファイルへの注釈とオーバーレイの例については、アニメーションの変更、注釈を参照してください。 |
重力による画像とテキストの位置調整
状況の「重力」
上記のように、大きな画像内に画像とテキストを配置できることは、他のあらゆることと同じくらい重要です。「-gravity
」設定はこの中で最も重要な側面の1つです。- ImageMagickメーリングリストで、Tim Hunterは次のように述べています。
- 「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]](gravity_default.jpg)
![[IM Output]](gravity_center.jpg)
![[IM Output]](gravity_south.jpg)
![[IM Output]](gravity_east.jpg)
![[IM Output]](gravity_northeast.jpg)
-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]](gravity_default_pos.jpg)
![[IM Output]](gravity_northeast_pos.jpg)
![[IM Output]](gravity_south_pos.jpg)
-gravity
」を「-draw image
」と共に使用して、単一のコマンドで複数の画像を処理することもできます。
|
![]() |
-composite
」を使用して、画像を背景にオーバーレイすることもできます…
|
![]() |
-compose
」設定の詳細については、アルファ合成を参照してください。複数の画像を1つの画像にオーバーレイおよび結合するその他の方法については、IMの例セクション複数画像のレイヤーを参照してください。重力を使用したテキストの配置
画像についてはそれで良いのですが、画像に直接テキストを描画することについてはどうでしょうか。画像の場合と同様に、基本的な効果は同じです。上記のように、重力は「-draw
」の「text
」メソッド、またはより優れた「-annotate
」テキスト描画演算子を使用してテキストの配置にも影響します。
|
![]() |
-gravity
」を定義せずにテキスト文字列を描画すると、文字列はフォントの「ベースライン」を基準に描画されます。例えば、実際にやってみましょう…
|
![]() |
-gravity
」を「NorthWest」に設定すると、テキストは画像のように配置されます。つまり、フォントによって定義されたバウンディングボックスまたはアンダーカラーボックスを基準に配置されます。例えば…
|
![]() |
-gravity none
」または「+gravity
」を使用して、デフォルトの「重力なし」設定に戻すことができます。テキストオフセットを適用し、「-gravity 」のデフォルトの「None 」と「NorthWest 」の引数を両方描画して、2つの形式がどれほど密接に関連しているかを確認してみましょう。
|
![]() |
重力を使用した左端のテキスト
最後の例として、画像の左端の中央に注釈を付ける方法を示します。ここでの問題は、テキストを回転させると、テキストの「ハンドル」を中心に回転することです。残念ながら、このハンドルはテキストが回転する前に重力によって設定されるため、特に「中央揃えのテキスト」を使用しない限り、うまく機能しません。![[IM Output]](gravity_text_left_fail.jpg)
例えば、テキストを画像の左端の中央に配置しようとする典型的な「最初の試み」です。もちろん、予想外に失敗します!
|
-gravity
」設定がテキストの「揃え方」(テキストの位置を設定するために使用される「ハンドル」を設定する)の直接設定にも使用されることです。「gravity」の効果を回転テキストに与えるアニメーションデモがPerlMagick APIでいくつか作成されています(「im_annotation.pl
」をダウンロードしてください)。また、同じプログラムのシェルスクリプトバージョン「im_annotation
」と「im_annotation_2
」も作成しました。これを機能させるためのトリックは、最初に画像全体を回転してから、中央南を使用することです。ナンセンスな解決策ですが、機能します。
|
![]() |
Drawを使ったテキストの位置合わせ
上記では、「-gravity
」点を基準にテキストを配置するために「テキストオフセット」を使用しましたが、それは唯一の方法ではありません。もう1つの方法は、「-draw translate」オプションを使用してテキストを配置することです。これには、重力効果を使用せずにテキストを配置しながら、重力を使用してテキスト内の配置「ハンドル」を「揃える」ことができるという利点があります。これらの例では、追加の構成線(これも重力の影響を受けません)を追加して、画像の中心点から位置がどのように適用されるかを示しました。オフセット付きのテキスト…
|
![]() |
|
![]() |
-draw text
」では、引数の1部であるオフセットを指定する必要があるため、コマンドラインから描画テキストを配置するためにより一般的に使用されます。しかし、これらの両方の方法が同じ結果をもたらす場合でも、テキストの回転も適用すると、完全に異なる結果が生成されます。基本的に、アクションが適用される順序が原因です。回転テキストを描画する
描画されたテキストを配置する方法は2つあります。「テキストオフセット」を使用するか、テキストを最終位置に「変換」します。これらの2つの配置方法の効果は、回転も適用すると非常に異なる結果になります。その理由は複雑ですが、本質的にはIMが描画サーフェスのワープを行う方法に関係しています。そうは言っても、2つの異なる位置を使用してテキストを回転した場合に何が起こるかを見てみましょう。回転のないオフセットのみ…
|
![]() |
|
![]() |
|
![]() |
-annotate
」演算子は、特にIMに回転させてテキストを描画するように指示することで、「サーフェスのワープ」を行うのではなく、回転テキストの配置を容易にするために特別に設計されました。回転とオフセットによるアノテーション…
|
![]() |
-gravity
" 設定が、背景画像上の位置だけでなく、描画されるオーバーレイ画像上の位置も参照することです。IMv7では、オーバーレイの位置を参照する「テキストの揃え方」が、グラビティ(背景の位置)とは別の(しかし関連する)設定として追加されます。Distortを使ったテキストの位置合わせ
SRT歪みと画像のレイヤリングを使用することは、画像(または画像内のテキスト)を配置するための特に優れた方法です。基本的に、画像が配置されるポイントと、そのポイントを基準とした画像の配置方法の両方について、完全な低レベル制御を可能にします。まず、透明な背景を持つ「テキスト画像」を作成し、その画像を背景画像に単純に「レイヤー」します。
|
![]() |
|
![]() |
+60+60
」に配置してみましょう。
|
![]() |
!
」フラグを使用した相対移動です。これの「ハンドル」は、レイヤー画像の性質上、左上隅です。SRT歪み演算子は、指定されたハンドルを使用して画像を移動するだけでなく、それらのハンドルの両方にサブピクセル(浮動小数点)の位置を使用できます。つまり、ほとんどの他の操作が持つ整数制限なしに、サブピクセル単位で任意の場所にテキストを歪ませることができます。最後の例は、90度回転したテキストを左端に配置することです。回転して位置合わせするテキストのハンドルは、今回はテキストの中央下部になります(回転前)。つまり、「%[fx:w/2],%h
」という計算された位置です。背景画像上の位置も、中心左端(「0,%[fx:h/2]
」)に計算する必要があります。問題は、SRT歪み演算子がテキスト画像を歪ませているときに背景画像にアクセスできないことです。解決策は、背景画像が利用可能なときにこの位置計算を行い、それをいくつかの「個人設定」に保存し、それを歪み引数に追加することです。このテクニックについては、他の画像から情報を抽出するで詳しく見ていきます。これが結果です。まず、背景画像上の位置を計算します。次に、その「ハンドル」も事前に計算された位置に移動するようにテキスト画像を歪ませます。
|
![]() |
my:
」文字列は、既存のプレフィックスと衝突しないものであれば何でもかまいません。つまり、私はImageMagickがコーダーまたは特定のオプションに使用できる他の設定とは別に、自分の設定を保持するために使用しています。「my:
」をプレフィックスとして付けるのは、そのためには良い選択です。パーセントエスケープは純粋に文字列置換として処理され、実際には歪みオプション全体を文字列として生成できます。唯一の問題は、「my:
」設定を設定した後で、それらの設定に対して数学演算を実行できないことです。したがって、すべての数学演算は事前に実行する必要があります。これは、FX式が%エスケープ変数を使用するようにIMv7で検討されるものです。