ImageMagick の例 —
テキストから画像への処理

索引
ImageMagick の例 序文と索引
ImageMagick のテキスト演算子
ラベル - 単純なテキストラベル
キャプション - ワードラップされたラベル
 
テキスト属性と設定
テキスト引数における特別なエスケープ文字
Pango - 基本的なフォーマット済みテキスト
テキスト - プレーンテキストのページ
Postscript/PDF - ドキュメントから画像へ
 
描画 - 既存のキャンバスへのテキスト描画
注釈 - より良いテキスト描画
 
フォントパス(開発中)
フォントメトリクスの決定
混合フォントスタイルの行の作成
フォーム入力 - 画像上のレイヤードテキストフィールド
テキスト処理の代替手段
テキストラベルの作成や画像へのテキストの追加は、おそらく ImageMagick が使用される最も基本的で一般的な操作の1つです。それは最も単純な操作の1つですが、非常に高度な結果を得る可能性があります。そのため、これは IM の機能を探求するための良い出発点です。

ImageMagick のテキスト演算子

ImageMagick には、画像内にテキストを描画できるさまざまな方法があり、画像処理ライブラリの汎用性を強調しています。このページでは、テキストを描画する特定の方法とスタイルについて詳しく説明します。これらの例を学ぶ際に心に留めておく必要があるのは、ImageMagick は主に画像変換および修正ツールであるということです。そのため、提供されている各方法は、ラベルや著作権メッセージを画像に追加するなど、単純なテキスト描画演算子です。画像への注釈付けを参照してください。すべてのテキスト演算子は、「-font」、「-pointsize」など、標準的なテキスト処理設定のセットを理解して使用します。また、「-fill」の色設定、より複雑なテキスト描画の場合は「-strokewidth」、「-stroke」、「-undercolor」の色も使用します。ラベルやキャプションなど、新しい画像を実際に作成する場合は、「-background」の色設定も使用されます。最後に、新しい「-kerning」と「-interword-spacing」の修飾子があります。ImageMagick は、完全なフォーマット済みテキストおよびドキュメントプロセッサではありません。高度なテキスト処理が必要な場合は、「TeX」(またはその派生版(下記の完全なテキスト処理システムを参照))のような完全なインタラクティブなワードプロセッサまたはバッチテキストフォーマッタを使用する方が良いでしょう。これらのプログラムの出力(一般的には Postscript 形式)は、次に ImageMagick によって画像に変換され、さらに変更できます。つまり、適切なツールを適切な作業に使用します。とは言っても、混合フォントの処理は可能です。出発点として、このページの下部近くにある混合フォントスタイルの行の作成を参照してください。では、テキストを画像に魔法のように追加できる基本的な方法を見てみましょう。次のセクション(複合フォント)では、興味深いフォント効果の生成について見ていきます。

ラベル - 単純なテキストラベル

基本的なラベル

"label:" 画像を使用してフォント画像を作成することは、ImageMagick でフォントを迅速に描画するより一般的な方法です。最大の利点は、現在の「-background」と「-fill」の色設定に従って独自のキャンバスを生成することで、描画されたテキストに合わせてサイズが調整されることです。たとえば、ここに一般的な生成されたラベルを示します。

  magick -background lightblue -fill blue \
          -font Candice -pointsize 72 label:Anthony \
          label.gif
[IM Output]
上記はおそらくラベルの最も一般的な使用方法であり、フォントの選択と「-pointsize」が結果を決定します。しかし、それはテキストラベルを生成する最も興味深い方法ではありません。
'label:' で生成された画像には、同じ文字列に設定された 'label' 画像プロパティ メタデータも含まれています。MIFF や PNG などのファイル形式は、その特定のプロパティを保存し、後続の画像処理プログラムで使用できます。'label' メタデータの使用例については、保存されたメタデータを使用したモンタージュで例を参照してください。
"-size" も指定すると、生成されたラベル画像は指定したサイズで作成されます。

  magick -background lightblue -fill blue  -font Candice \
          -size 165x70 -pointsize 24 label:Anthony     label_size.gif
[IM Output]
"-gravity" を使用して、そのより大きなボックス内のラベルの位置を設定することもできます。

  magick -background lightblue -fill blue  -font Candice \
          -size 165x70  -pointsize 24  -gravity center \
          label:Anthony     label_gravity.gif
[IM Output]
もちろん、ラベルの "-size" を設定しないと、生成された "label:" に "-gravity" を使用できる余分なスペースはなくなります。そのため、あまり役に立ちません。"-size" と "-pointsize" の両方を一緒に使用すると、テキストが指定された画像サイズを超える可能性があります。

  magick -background lightblue -fill blue  -font Candice \
          -size 165x70  -pointsize 72  -gravity center \
          label:Anthony     label_overflow.gif
[IM Output]
バージョン 6.5.2-4 より前では、"-size" 設定も指定されている場合、IM は "-pointsize" 設定を完全に無視していました。これにより、上記の画像のテキストは、'最適な大きさ' の処理に従って自動的にサイズ調整されます(次の例を参照)。

画像への最適な大きさ

特定の "-size" のラベルを生成するための最大のトリックは、ラベルの "-pointsize" を指定しないことです。これにより、IM は要求された画像サイズに *最適に適合する* フォントサイズを選択する自由度を持ちます。つまり、描画されたテキストは指定されたサイズに合わせて調整されます。

  magick -background lightblue -fill blue  -font Candice \
          -size 165x70  label:Anthony     label_size_fit.gif
[IM Output]
ご覧のように、"-size" 設定を設定すると、画像の右側または下側に余分なスペースが生じる可能性があります。
IM が '最適な大きさ' のラベルを作成すると、使用された実際のポイントサイズは 'label:pointsize' 画像プロパティ にも保存され、後でその情報を使用できます。これは、フォーラムのディスカッション Pointsize Reporting 中に IM v6.6.2-7 に追加されました。
"-gravity" 設定を調整することで、その余分なスペース内のラベルの位置を調整できます。

  magick -background lightblue -fill blue  -font Candice \
          -size 165x70 -gravity center label:Anthony     label_size_gravity.gif
[IM Output]
もちろん、ラベルの "-size" を設定しないと、生成された "label:" に "-gravity" を使用できる余分なスペースはなくなります。そのため、画像を特定のサイズにするように要求する場合にのみ意味があります。最高のニュースです。"-size" 設定でラベルの幅または高さを指定した場合、フォントはその指定されたディメンションに最適に適合するように調整されます。指定されていないもう一方のディメンションは、テキストに合わせて自動的に調整されます。

  magick -background lightblue -fill blue -font Candice \
          -size 160x  label:Anthony     label_size_width.gif
[IM Output]
基本的に、上記の "label:" は常に幅 160 ピクセルで、その幅に最適なフォントサイズになります。ラベルの高さはそれに合わせて調整されます。高さのみを指定し、幅を指定しない場合も同じことが行われます。

  magick -background lightblue -fill blue -font Candice \
          -size x40  label:Anthony     label_size_height.gif
[IM Output]
このラベルは高さ 40 ピクセルで、テキストの未定義のポイントサイズは高さに合わせて調整され、未定義の幅は描画されたテキストに合わせて設定されました。まさに期待通りです。もちろん、この場合も、"-gravity" 設定を使用できる余分なスペースはほとんどまたはまったくありません。

複数行のラベル

"label:" ジェネレータは(IM バージョン 6.2.5 から)、複数行のラベルを生成できます。

  magick -background lightblue  -fill blue  -font Ravie -pointsize 20 \
          label:'ImageMagick\nRules - OK!'     label_multiline.gif
[IM Output]
ご覧のように、「label:」は改行を表す'\n'の使用を理解しています。つまり、コマンドラインにデータを入れる際に、特殊文字をエスケープするように入力テキストを事前に処理する必要があるかもしれません。詳細は下記のテキスト引数内の特殊エスケープ文字を参照してください。「-gravity」も「label:」の生成に影響を与えるため(IMバージョン6.2.6以降)、これを用いて複数行ラベルの「揃え」を行うことができます。

  magick -background lightblue -fill blue -font Corsiva -pointsize 24 \
          -gravity center    label:'ImageMagick\nExamples\nby Anthony' \
          label_centered.gif
[IM Output]
IMの重要な機能の1つは、ファイルから使用するテキストデータを読み取ることができることです。これは、ファイル名の前に'at'文字'@'を付け、これを文字列引数として使用することで行われます。例えば、ここではワークステーションの「今日のメッセージ」ファイルからラベルを作成します…


magick -background lightblue -fill blue \ label:@/etc/motd label_file.gif
[IM Output]
ラベルのテキストは標準入力パイプラインからも読み取ることができます。例えば、ここでは引用文生成ツールの出力を複数行ラベルに変換します。

  mesgs ImageResolution |\
    magick -background lightblue  -fill blue \
            label:@-   label_file_multiline.gif
[IM Output]
私が使用したファイル名は単なる'-'文字であることに注目してください。これは、ファイルが標準入力から読み取られることを意味します。'@filename'を使用して、任意のコマンドライン文字列引数をIMに読み込むことができることを覚えておいてください。これには、以下に示す他のすべてのテキスト入力方法が含まれます。ただし、文字列引数の一部ではなく、文字列引数を全体として置き換える場合にのみ使用できます。また、上記の例では、ラベル画像に余分な空白行が追加されています。この空白行は、入力テキストファイルの最後の改行によって発生します。入力ファイルから最後の改行を削除しない限り(この修正方法については下記のcaption:の例を参照)、「label:」には常に、入力テキストファイルからのこの空白行が含まれます。
ほとんどの古いバージョンのIM(v6.2.5以前)は、複数行ラベルを処理できません。これらのバージョンでは、行が連結されて非常に長い1行になります。

垂直方向のラベル

もちろん、入力テキストに改行を追加することもできます。例えば、ここでは単純な単語を取り、各文字の間に改行を追加して、中央揃えの垂直テキストを作成します。

  echo -n "Vertical" | sed 's/./&@/g; s/@$//' | tr '@' '\012' |\
    magick -background lightblue -fill blue -font Ravie -pointsize 24 \
            -gravity center    label:@-   label_vertical.gif
"sed"コマンドは、文字列の最後を除いて、各文字の後に'@'文字を追加します。"tr"はその後、'@'文字を改行に置き換えます。また、入力テキストが改行で終わっていないと仮定しており、改行があると結果の画像の下部に余分な空白が追加されます。
[IM Output]
Linuxを使用し、したがってGNU版の"sed"コマンドを使用しているユーザーは、"tr"を削除し、sedコマンド内の'@'を'\n'に置き換えることで、各文字の間に改行を直接挿入できます。行間隔という特別な属性も参照してください。これを使用して文字間のスペースを調整できます。

キャプション - ワードラップされたラベル

テキスト入力ジェネレータからの"caption:"画像は、ほとんどの点で「label:」と全く同じですが、指定された"-size"設定に合わせてテキストサイズを拡大する代わりに、指定された"-size"幅に収まらない長い行を折り返します。"-size"設定は必須であり、少なくともピクセル単位の最大幅を指定する必要があります。例えば、ここでは、指定された幅に収まらない長い行のキャプションを示します。

  magick -background lightblue  -fill blue  -font Corsiva -pointsize 36 \
          -size 320x   caption:'This is a very long caption line.' \
          caption.gif
[IM Output]
生成された'caption:'画像には、同じ文字列に設定された"caption"画像プロパティメタデータも含まれており、後でその情報を使用できます。すべての一般的な画像ファイル形式はこの情報を画像と共に保存します。例については保存されたメタデータを使用したモンタージュを参照してください。
デフォルトではテキストはすべて左揃えですが、IMバージョン6.2.0以降、「caption:」はテキストの揃えのために「-gravity」を尊重します。

  magick -background lightblue  -fill blue  -font Candice -pointsize 40 \
          -size 320x  -gravity Center  caption:'ImageMagick Rules OK!' \
          caption_centered.gif
[IM Output]
"-size"設定に幅と高さの両方を指定した場合、画像の高さもその高さに設定されます。その後、「-gravity」設定を使用して、テキストを垂直方向に配置することもできます。

  magick -background lightblue  -fill blue  -font Gecko -pointsize 32 \
          -size 320x100  -gravity South caption:'Captions at their height!' \
          caption_height.gif
[IM Output]
ただし、指定された"-pointsize"でテキストが"-size"に(高さ方向に)収まらない場合は、テキストがボックスからはみ出します。現在の"-gravity"設定によって、テキストのどの部分が切り取られるかが自然に決定されます。例えば、これは前の例と全く同じですが、結果に対して小さすぎる画像"-size"を使用しています。

  magick -background lightblue  -fill blue  -font Gecko -pointsize 32 \
          -size 320x60  -gravity South caption:'Captions at their height!' \
          caption_height_toosmall.gif
[IM Output]

最適なサイズへの調整

IM v6.3.2以降、最終画像の幅と高さの両方を指定するが、フォントの"-pointsize"を定義しない(または"+pointsize"でpointsizeをオフにする)場合、IMは要求された画像の"-size"を最適に満たすようにフォントサイズを自動的に調整しようとします。例えば、ここではImageMagickにかなり広い領域を埋めるように指示します…

  magick -background lightblue -fill blue -font Candice -size 320x140 \
          caption:'This text is resized to best fill the space given.' \
          caption_filled.gif
[IM Output]
そして、同じフォントと文字列に対して、はるかに小さく薄い領域です。

  magick -background lightblue -fill blue -font Candice -size 80x110 \
          caption:'This text is resized to best fill the space given.' \
          caption_filled_sm.gif
[IM Output]
最後の2つの例の唯一の違いは、生成された画像の"-size"です。IMは、指定された画像サイズを最適に満たすようにテキストと単語の折り返しを調整しました。これは、領域からはみ出すことなく、不明なテキストを特定のスペースに合わせるのに非常に役立ちます。しかし、内部的には、IMが使用する適切なポイントサイズを検索するため、複数回キャプションを実行することと同等です。つまり、特定の"-pointsize"を指定した場合に比べて、10倍以上遅くなることがよくあります。

段落を含むキャプション

"caption:"画像演算子(IM v6.2.5以降)は'\n'シェルエスケープ(そのため、バックスラッシュをエスケープするには'\\'を二重にする必要があります)を改行または段落として理解しています。このバージョンより前のバージョンでは、個別の段落を個別の"caption:"操作で処理する必要がありました。

  magick -background lightblue -fill blue \
          -font Ravie -pointsize 24 -size 360x \
          caption:"Here I use caption to wordwrap.\nTwo separate lines." \
          caption_multi_line.gif
[IM Output]
"label:"と同様に、'@'ファイル名プレフィックスを使用して、描画するテキストをファイルまたは標準入力(前のパイプラインコマンドからの)から読み取ることができます。

  mesgs FilePrivate |\
    magick -background  lightblue  -fill blue  -pointsize 12 \
            -size 320x  caption:@-  caption_file.gif
[IM Output]
ご覧のように、入力テキストの改行は(IM v6.2.5以降)段落区切りとして扱われます。これには、入力ファイルの最後の改行も含まれます。もちろん"label:"は行を折り返さず、そのまま維持します。ファイルを単一の段落として扱う必要がある場合は、改行文字をスペース文字に置き換えて、すべてのテキストを1行にする必要があります。例えば、ここでは同じテキストを使用しますが、改行をスペースに置き換え、単語間の複数のスペースを1つのスペースに置き換えます…

  mesgs FilePrivate |      tr '\012' ' ' | sed 's/  */ /g' |\
    magick -background  lightblue  -fill blue  -pointsize 12 \
            -size 320x  caption:@-  caption_one_line.gif
[IM Output]
ご覧のように、これははるかにうまく機能します。しかし、多くの場合、空白行を段落区切りとして扱うことが望ましいです。つまり、空白行に関係する改行を除いて、すべての改行を削除する必要があります。"caption:"に必要な形式にこのようなテキストを変換するための特別な"sed"コマンドを以下に示します。この場合、テキストは"magick"マニュアルページの最初のページです。

  man magick | col -b | expand | \
    sed '/^$/d; :loop y/\n/ /; N; /\n$/! b loop;  s/   */ /g; s/^ //' |\
      head -n 7 |    magick -size 400x  caption:@-  caption_manual.gif
[IM Output]
キャプションには「揃え」テキストオプションはありません。しかし、pango:テキストフォーマッタ(外部ライブラリを使用)にはその機能とさらに多くの機能があります。

テキスト属性

元々は、テキスト処理に影響を与える設定には、「-font」、「-fill」、「-pointsize」、「-size」、および「-gravity」が含まれていました。これらの属性制御の多くは既に上記で紹介しましたが、あまり使用されない属性制御や、元々は「label:」または「caption:」テキスト画像生成に影響を与えなかった属性制御もあります。IM v6.3.2以降、「-stroke」、「-strokewidth」、および「-undercolor」も使用できます。「label:」または「caption:」に対してです。例えば、ここでは多くの異なる設定を使用して、IMテキスト画像レンダリングの属性を制御します…

   magick -background white -fill dodgerblue  -font Candice \
           -strokewidth 2  -stroke blue   -undercolor lightblue \
           -size 165x70 -gravity center label:Anthony     label_color.gif
[IM Output]
これらの設定の詳細については、下記の下色ボックスと、描画セクションのストローク、ストローク幅を参照してください。
現時点では、「-tile」、「-fill」、「-background」、「-origin」を使用して定義されたタイル画像を「label:」または「caption:」で使用することはできません。単色のみを使用できます。そうしようとすると、未定義の(黒)色が生成されるだけです。

ポイントサイズ、密度、および実際のフォントサイズ

ピクセルはディスプレイまたは画像上の点であり、IMはそれで動作します。一方、画像は特定の解像度(「dots per inch」(dpi)または「pixels per inch」(ppi)として指定)で印刷されます。そのため、画像の解像度は、他のプログラムが特定のメディアに画像のサイズを調整する方法に影響します。例:現実世界の画像の物理的なサイズに影響します。画像の解像度(密度またはdpi)は、画像のピクセルサイズ、および画像がメモリまたはディスク上で占めるスペースとは無関係です。また、一般的に、ほとんどのIM画像操作とは無関係です。そのため、ImageMagickにとって、解像度は画像に保存されている数値のセットであり、通常は無視されます。画像の解像度または密度が関連するのは、フォントの場合と、PostScript、PDF、MWFなどのベクトル形式をIMが処理するラスター画像形式に変換する場合のみです。「-density」設定は、出力デバイスに存在する1インチあたりのピクセル数(ppi)をIMに指示し、これを使用して画像生成とフォントサイズを調整して一致させることができます。たとえば、デフォルトではIMは「-density」設定を72 ppiで使用しますが、これはモニターやウェブページに画像を表示する際の一般的な設定です。フォントのサイズは「ポイント」で指定され(「-pointsize」を使用)、定義上1ポイントは1/72インチなので、72ポイントのフォントは高さ約1インチのテキストを生成するはずです…

  magick -pointsize 72 label:Hello  pointsize.gif
[IM Output]
しかし、ほとんどの最新のディスプレイはこれよりも優れた解像度を持ち、通常は1インチあたり90〜120ピクセル(ppi)です。そのため…

  magick -density 90 -pointsize 72 label:Hello  density.gif
[IM Output]
90 dpiのディスプレイで高さ1インチのラベルを生成する必要があります。私のディスプレイではそう表示されています!ディスプレイの解像度を確認するために、画面上のこれらの画像の高さを測定できます。1インチあたりのピクセル数が多いほど、描画されるフォントも画像のピクセル数に関して自然に大きくなり、そのため画像が大きくなります。異なる画像プログラムは、多くの場合、異なるデフォルト密度を持ち、これにより、同じポイントサイズでも、異なるプログラムによって描画されたフォントの外観が異なる場合があります。「-pointsize」は実際にはフォントの**行間隔**(実際には描画領域の高さ)を意味し、描画された文字の実際の高さ**ではありません**!そのため、同じポイントサイズと密度でも、フォントによっては、あるフォントが別のフォントよりも大きくまたは小さく表示される場合があります。同じになるのはフォントの行間隔のみで、それ以外はフォントとフォントのデザイナーに依存します。そのため、デフォルトの「-density」が72dpi(1ポイントは1ピクセル)の場合、12ポイントのフォントでは、2行のテキストのベースライン間に12ピクセルの間隔が必要です。
生成された「label:」画像の高さは、画像の描画領域または境界ボックスに基づいており、多くの場合、フォントの行間隔とポイントサイズです。これは必ずしもそうではなく、そのため、テキストの行を垂直に追加するだけでは、実際には正しくないフォント処理になります!
一部のフォントは、通常の行間隔の境界をはるかに超えて、行間隔の上または、より一般的には下に大きく広がる場合があります。これは、手書きフォントに特に当てはまります。フォントの**外観**は、フォントの「-pointsize」と「-density」によっても影響を受けます。フォントのポイントサイズを2倍にする(「-pointsize 24」)と、密度または解像度を2倍にしたフォントとほぼ同じサイズに見えるフォントが生成されます。ただし、フォントは特定の方法に見えるように設計されているため、フォントの線の太さは、ポイントサイズが大きくなってもあまり変化しない場合があります。つまり、フォントサイズが大きいとわずかに異なります。しかし、密度を2倍にした場合(「-density 144」)、12ポイントのフォントは寸法が2倍になって描画され、元の12ポイントのフォントのように見えますが、スケールが大きくなり、エッジの滑らかさが向上します。ただし、解像度が非常に低いと、ピクセルの物理的なサイズ制限がフォントの外観に影響を与える場合もあります。これは、密度が定義するピクセルサイズが大きいため、細い線が低い密度で太くなる可能性があることを意味します。「密度」と「ポイントサイズ」の関係は非常に複雑な問題であり、専門のフォントグラフィックデザイナーだけが完全に理解し、正しく処理するようにフォントを設計できます。IMフォーラムのLithiumによると…
これはTrueTypeフォントレンダラーの機能だと思います。TrueTypeグリフは曲線のセットだけでなく、ピクセル単位の出力サイズに応じてポイント座標を調整する詳細レベルと命令を複数含む場合があり、ピクセルサイズが小さいほど目立ちます。そのため、小さいテキストは縮小された大きいテキストとは異なる(そしてよりクリアな、気づきやすい)ように見えます。
将来の例:同じ「ピクセル」サイズだが、密度とポイントサイズが異なるフォントの違い。基本的にこれらの要因の1つを増やし、もう一方を同じ量だけ減らすと、*同じ*結果にならない場合があります。特に、線の太さとフォント全体の「スタイル」に関しては。行っている作業に適した要因を調整する方が良いでしょう。出力デバイスのフォントのスケーリング、またはフォントの後のサイズ変更を行う場合は「-density」を使用し、通常のフォントサイズの変更には「-pointsize」を使用します。フォントについてもっと知りたい場合は、非常に興味深いと感じたドキュメントTrueType Fundamentals(PDF)をご覧ください。

ラベル画像の境界

特殊なフォントを使用する場合、フォントが拡張文字を使用することがあり、過去にはIMでこれらのフォントのラベルを作成する際に多くの問題がありました。つまり、テキストが提供されたキャンバスからはみ出します。たとえば、特定の有名な清涼飲料水を彷彿とさせる「LokiCola」フォントの2つの大文字を示します。

  magick -background lightblue -fill blue -font LokiCola -pointsize 64 \
          label:HC  label_overflow_font.gif
[IM Output]
ご覧のとおり、IMはフォントの先頭または末尾のグラフィックを切り取ることなく、このフォントをラベルに収めることができます。
IM v6.3.2より前では、「label:」は上記の例で「H」の先頭と両方の文字の末尾の一部を切り取っていました。
この問題が存在した理由は、フォントの「グリフ」または文字の説明が、特定の文字のフォントで定義された境界の外側に描画され、フォント内の他の文字と重複するためです(一般的には上または下)。これはフォント自体の設計と定義方法の問題であり、IMの欠陥ではありませんでしたが、IMは現在、ユーザーの利益のためにこれらの奇妙な状況を処理しています。他の状況では依然として問題となる可能性があり、複数行のテキストの相互作用のために簡単に解決できない可能性があります。より正確な説明については、以下の境界ボックスのオーバーフローの例を参照してください。

UnicodeまたはUTF8形式のテキスト

IMに文字列引数を供給するこの方法は、通常はコマンドラインから非常に困難な操作を可能にするため非常に重要です。具体的には、「Unicodeテキスト」の処理、または文字コードを使用して特定の文字を選択することです。コマンドやスクリプトにUnicode文字を入力できる場合は、直接使用できます。

  magick -background lightblue -fill blue -pointsize 32 \
          label:' é è à ù ç Ö ÿ ‘ ’ “ ” ° ² ³ € x ÷ '    label_i8n.gif
[IM Output]
ただし、Unicode文字の入力を適切に処理するようにキーボードまたはエディターを設定している人はほとんどいません。Unicode文字を直接入力できない場合でも、簡単な解決策の1つは、既存のUTF-8テキストファイルまたはウェブページから目的の文字を「コピー&ペースト」することです。私はそうします!描画したいUTF-8テキストが既に生成されている場合は、「@filename」を使用してファイルから直接読み取ることができます。たとえば、ここでは、UTF-8でエンコードされた中国語テキストファイル(ファイルの最終行改行なし)から中国語のラベルを作成します。

  magick -background lightblue -fill blue -pointsize 48 \
          -font ZenKaiUni label:@chinese_words.utf8   label_utf8.gif
[IM Output]
上記の例で使用されているフォントは特殊なものであり、Fedora Linuxフォントの「SimSun」(またはフォントファイル「gkai00mp.ttf」)、 「ZenKaiUni」(ファイル「ukai.ttf」)、「ShanHeiSunUni」(ファイル「uming.ttf」または「zysong.ttf」または「bsmi00lp.ttf」のいずれか)など、定義済みの中国語グリフの完全なセットが含まれています。

後の例で使用されているWindowsフォント「Mincho」も多くの中国語グリフを定義していますが、不完全です。上記で使用すると、未定義のグリフにはいくつかの疑問符が表示されます。

特殊なスクリプト「imagick_type_gen」を使用して、フォントの適切な名前を見つけ、抽出し、ImageMagickの「type.xml」構成ファイルに追加しました。

また、「GNU」の「printf」プログラム(Linuxシステム)を使用してUnicode番号を特定のUTF-8でエンコードされた文字列(この場合は、適切に組版された開始引用符と終了引用符)に魔法のように変換することにより、Unicode文字コードからUTF-8文字列を生成することもできます(UTF-8入力の最終行改行なし)。たとえばここでは、Unicode文字コードを使用してUTF-8テキストを生成し、コマンドパイプラインを使用してフィードします(実際のファイルではなく「@-」を使用して「stdin」から読み取ります)。

  env LC_CTYPE=en_AU.utf8 \
    printf "\u2018single\u2019 - \u201Cdouble\u201D" | \
      magick -background lightblue -fill blue -pointsize 36 \
              label:@-  label_quotes.gif
[IM Output]
Mac OSXやWindowsなどの他のシステムでは、perlの「printf」を使用して、Unicode文字コードからUTF-8でエンコードされた文字列を出力できます。

  perl -e 'binmode(STDOUT, ":utf8"); \
    print "\x{201C}Unicode \x{2018}\x{263A}\x{2019} Please\x{201D}";' |\
      magick -background lightblue -fill blue -pointsize 36 \
              label:@-  label_unifun.gif
[IM Output]
詳細情報および様々な言語と記号のUnicode文字コードを参照するには、Unicode文字コード表を参照してください。Unicode文字には国際的な文字が含まれるだけでなく、適切なフォントを使用すれば、Unicodeで定義されている特別な「記号」セットを使用することもできます。「DingBats」シンボルフォントはその中でも最も有名です。このフォントは非常に一般的になり、現在は標準のUnicodeフォントセットの一部となっています。例えば、私が作成した特別な"graphics_utf"シェルスクリプトを使用して、'DingBats' Unicodeシンボル領域の先頭24文字をUTF-8テキストとして「ブロック」で抽出しました。

  graphics_utf -N 2701 2718 |\
    magick -font Mincho -pointsize 32 label:@-   label_dingbats.gif
[IM Output]
上記の疑問符は、UnicodeでもWindowsの'Mincho'フォントでも定義されていない特定の文字です。より具体的には、元の'dingbat'フォントの一部であったシンボルはUnicodeに存在しますが、予想されるdingbatコードとは異なるUnicode文字コードを使用しています。Dingbats Unicode仕様表で詳細を確認し、「欠落している」dingbat文字に使用する正しいUnicode文字を参照してください。多くのフォントでは、疑問符ではなく、このような未定義の文字に対して四角形や空白文字を表示するだけです。出力にそのような文字が多すぎる場合、または文字が欠落している場合は、異なるフォントを使用する必要があります。膨大なUnicode文字フォントの一部として利用可能な他のシンボルセットには、トルキンのルーン文字、数学記号、ローマ数字、矢印、点字、および技術記号などがあります。「graphics_utf」シェルスクリプトを使用すると、それらを探索できます。Microsoft 'Mincho'フォントでレンダリングできるUnicode文字の別の例を以下に示します。この例は、「その他の記号」セクションからのものです…

  graphics_utf -N 2620 2630 |\
    magick -font Mincho   -pointsize 40 label:@- label_misc.gif
[IM Output]
DOSスクリプト内でUnicodeを使用するのは、UNIXやLINUXよりもはるかに困難です。その環境からのUnicodeの使用に関する特別な注意事項は、Wolfgang HugemannによってWindows文字エンコーディングで提供されています。

シンボルフォント

特殊なテキスト画像を探している人がより一般的に使用するものは、特別な「シンボルフォント」です。これらは完全な大規模なUnicodeフォントよりもはるかに小さく、標準のASCII文字(文字と数字)を特定の形状と画像の異なるセットに置き換えるだけです。ただし、場合によっては(まれに)、ラテンメタ文字領域にさらに多くの記号が含まれることもあります。「DingBat」フォントの記号はこの方法で始まりましたが、前述のように、現在はUnicode文字セットの一部となっています。たとえば、私がよく使用するシンボルの1つは「WebDings」フォントからのものです。これはかなり良い「曲線のあるハート」記号で、そのフォントの定義では通常の'Y'文字を置き換えます…

  magick -size 20x20 -gravity center -font WebDings label:Y label_heart_20.gif
  magick -size 40x40 -gravity center -font WebDings label:Y label_heart_40.gif
  magick -size 60x60 -gravity center -font WebDings label:Y label_heart_60.gif
  magick -size 80x80 -gravity center -font WebDings label:Y label_heart_80.gif
覚えておくべき重要なことは、すべてのTrueTypeフォントは実際にはベクターイメージフォーマットの特殊なタイプであるということです。フォントには複数の画像(文字ごとに1つ)があります。ベクター画像であるため、フォントを使用すると、「-size」、「-pointsize」、「-density」で提供されるコントロールを使用して、ほぼ任意のサイズ(スケール)で文字、形状、または記号を描画できます。上記のように、「曲線のあるハート」は私が望むほぼ任意のサイズで「レンダリング」できます。一部のフォントは非常に専門的です。たとえば、IDAutomationから「IDAutomationHC39M.ttf」というフォントファイルを入手して、バーコードを生成できます。例として…
[IM Output] [IM Output] [IM Output] [IM Output]

  magick -font IDAutomationHC39M -pointsize 16 label:'*314-76*' \
          -bordercolor white -border 5x5  label_barcode.gif
[IM Output]
さまざまな理由で収集したさまざまなシンボルフォントで見つけた、その他の興味深いシンボルを以下に示します…

  magick -pointsize 48 -font WebDings label:' " _ ~ ) - '  label_webdings.gif
  magick -pointsize 48 -font LittleGidding label:' x o w ' label_ltgidding.gif
  magick -pointsize 48 -font WingDings2      label:'ab'    label_wingdings2.gif
  magick -pointsize 48 -font Zymbols  label:' ? , - I Z '  label_zymbols.gif
  magick -pointsize 48 -font TattoEF  label:' B Y D I H '  label_tatooef.gif
  magick -pointsize 48 -font SoundFX  label:' V 3 t f 9 '  label_soundfx.gif
これは利用可能なもののほんの一例です。想像できるほぼすべてのシンボル、形状、または画像の膨大なライブラリがWWWで利用可能であり、閲覧してダウンロードできます。
[IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
描画された各文字には、描画できる2つの別々の部分があります。「塗りつぶされた」領域(上記で示しました)と「ストローク」またはアウトラインで、塗りつぶされた領域とは非常に異なる場合があります。これらの領域はそれぞれ個別に、または異なる色で描画できるため、有望なシンボルや形状をさまざまな方法で詳しく調べることをお勧めします。非常に驚くべき結果が得られる可能性があります。これを行うための例については、複合フォント、ストロークを参照してください。
シンボルフォントの多くの作成者は、画像や形状の適切なデザインやクリーニングを行わずに、単純なスキャナーとビットマップからベクターへのコンバーターを使用して形状を生成します。このような「スキャンされた」フォントを見る際には、注意が必要です。

上記で最後に示したフォントは、そのような「スキャンされた」フォントの1つの例であり、他のより適切に設計されたフォントと比較して、見栄えの悪い「ドット状」の品質を与えています。

文字間カーニング

IM v6.4.7-8以降、「-kerning」を使用して、テキスト文字列内の各文字間に追加の文字間スペースを挿入できます。例として

  magick -pointsize 12               label:Anthony   label_kerning_0.gif
  magick -pointsize 12 -kerning 1    label:Anthony   label_kerning_1.gif
  magick -pointsize 12 -kerning 2.5  label:Anthony   label_kerning_2.gif
  magick -pointsize 12 -kerning 5    label:Anthony   label_kerning_5.gif
  magick -pointsize 12 -kerning -1   label:Anthony   label_kerning-1.gif
[IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
実際のカーニング値は浮動小数点値、または負の値にすることもできます。「-kerning」値の負の値の別の例については、結合複合フォントの例を参照してください。

単語間スペース

また、IM v 6.4.8-0以降、「-interword-spacing」を使用して、単語間に使用されるスペース文字のサイズを変更できます。例として

  magick                       label:'I Love IM!'  label_wspace_off.gif
  magick -interword-spacing 1   label:'I Love IM!'  label_wspace_1.gif
  magick -interword-spacing 10  label:'I Love IM!'  label_wspace_10.gif
  magick -interword-spacing 25  label:'I Love IM!'  label_wspace_25.gif
[IM Output] [IM Output] [IM Output] [IM Output]
単語間のスペース文字のサイズを増減できるだけでなく、デフォルトのサイズを小さくすることもできることに注意してください。ただし、スペースがあると単語がピクセル境界に再配置されるため(上記の文字間カーニングとは異なります)、スペースをゼロに設定したラベルの出力は、スペースを含まないラベルとは依然として異なります。文字間カーニング単語間スペースの両方が、IMがテキスト文字列を特定のサイズの画像に自動的に合わせる機能の結果にも影響します。

  magick -size 150x                       label:'I Love IM!' label_wsize_of.gif
  magick -size 150x -interword-spacing 25 label:'I Love IM!' label_wsize_25.gif
  magick -size 150x -interword-spacing 50 label:'I Love IM!' label_wsize_50.gif
[IM Output] [IM Output] [IM Output]
"-interword-spacing"を設定することにより、'スペース'文字のサイズが他のテキストサイズと一緒に変化しなくなるため、何が起こっているのか説明します。したがって、IMが最適な"-pointsize"を算出しようとすると、単語間のスペースの量は固定され、テキストを指定された固定幅に合わせることに関与しません。その結果、「-interword-spacing」が大きくなるほど、テキスト行を同じ指定された画像幅に合わせるために必要なフォントのサイズは小さくなります。負の値を使用でき、特定の文字とフォントを使用して単語をオーバーラップさせる、または珍しい効果を生み出すことができます。ただし、あまりにも負の値にすると、未定義の動作が発生する可能性があります。これを行う場合は注意が必要です。上記はテキストの揃えの例ではありません(そう見えますが)、これらのオプションを使用して、適切なテキストの揃えを行う出発点にすることができます。本当にそのレベルのテキストフォーマットと揃えが必要な場合は、事前フォーマットされたテキストまたはPostscriptを生成する他の方法、たとえばコマンドラインベースの「TeX」または「LaTeX」ソフトウェアを検討する方が良いでしょう。さらに良いのは、SVG(rsvgライブラリバージョン)またはPangoマークアップ言語(下記参照)を使用して、揃えられたテキストを生成することです。

行間スペース

IM v6.5.5-8以降、別のオプション「-interline-spacing」が追加されました。これは、以前の設定に照らしてユーザーから強く求められ、多くの点ではるかに役立ちます。基本的に、テキストの個々の行間にこの多くのピクセルを追加または減算します。つまり、テキストの個々の行を展開したり、圧縮したりするために使用できます。例として…

  magick                        label:'First\nSecond'  label_lspace_off.gif
  magick -interline-spacing  5   label:'First\nSecond'  label_lspace_5.gif
  magick -interline-spacing 10   label:'First\nSecond'  label_lspace_10.gif
  magick -interline-spacing 20   label:'First\nSecond'  label_lspace_20.gif
  magick -interline-spacing -5   label:'First\nSecond'  label_lspace-5.gif
  magick -interline-spacing -10  label:'First\nSecond'  label_lspace-10.gif
[IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
この設定を最大限に活用するには、特定のフォントの通常の行間隔を計算できる必要があります。これは「-pointsize」の実際の定義であり、現在の解像度または「-density」設定でフォントの行間隔が定義されます。フォントの実際の高さや線の太さを定義するわけではありませんが、特定のフォントのこれらの側面に影響を与えます。したがって、「-density」を'72'dpi(1インチあたりのドット数)とし、定義上1インチあたり72ポイントあることを知っていれば、12ポイントのフォントの行間隔は12ピクセルであると計算できます。その情報を使用して、「-interline-spacing 12」の設定を使用することで、12ポイントのテキスト行を「2倍行間」にすることができます。これにより、行間に12ピクセル追加されます。

  magick -density 72 -pointsize 12 -interline-spacing 12  -font Arial \
          label:'First\nSecond\nThird'  label_lspace_double.gif
[IM Output]
もちろん、単語間のサイズの場合と同様に、テキスト要素間に一定数のピクセルを追加すると、自動的なポイントサイズ処理を使用する場合、テキストが小さくなる傾向があります。つまり、"-pointsize"の設定なしで、最終的な画像"-size"が提供されます。

  magick -size x70  -interline-spacing 18  -font Arial \
          label:'First\nSecond\nThird'  label_lspace_size.gif
[IM Output]
負の行間隔を使用して、行を繰り返し、ベースラインの分離よりも1ピクセル多く減算することで、ラフで簡単な方法でテキストを垂直方向に「太字」にすることもできます。

  magick -density 72 -pointsize 12 -interline-spacing -13 -font Arial \
          label:'Bolded Word\nBolded'  label_lspace_vbold.gif
[IM Output]
もちろん、本当に2行が必要で、単にテキストを太字にするだけではない場合は、これは機能しません。固定幅フォントの方が効果があります。

テキスト引数内の特殊なエスケープ文字

既に、上記のさまざまなテキスト引数で使用される特殊なエスケープ文字を紹介しました。具体的には、バックスラッシュ'\'を使用して改行などの特殊文字をエスケープしたり、画像プロパティページで定義されているように、パーセント'%'エスケープを使用して文字列に追加情報を挿入したりできます。また、行の先頭に使用すると、テキスト引数の残りをファイル名として使用して、指定されたファイル(または'-'が使用されている場合はSTDIN)からデータを読み取る特殊な'@'エスケープがあります。
一部のシステム(ubuntuなど)では、セキュリティポリシーを使用して'@{file}'エスケープの使用が無効になっています。システムに存在するポリシーとその設定場所を確認するには、magick -list policyと入力してください。
これらのエスケープ文字は、"-format"("magick identify"、"-identify"、および"info:"で使用)だけでなく、画像生成コマンドの"label:"と"caption:"、そして画像メタデータ設定オプションの"-label"、"-comment"、"-caption"にも影響を与えます。さらに、"-annotate"でも使用されます。
バックスラッシュ'\'は"-draw"の'text'メソッドで使用されますが、パーセント'%'のエスケープは、ImageMagickのSVG画像処理と干渉するため、**使用されません**。これが、IMバージョン6で"-annotate"オペレータが作成された理由の1つです。

エスケープ文字に関するもう1つの重要な点は、コマンドラインのテキスト引数で使用される一方で、テキストファイルから読み取られるデータ(通常は'@'エスケープを使用して読み込まれます)内では決して適用されないことです。つまり、テキストファイルデータのエスケープをエスケープする必要はありませんが、テキストに情報を挿入する必要がある場合は、IMの外でファイルデータを自分で処理する必要があります。
入力テキストファイルのエスケープ処理からの保護は、IMバージョン6.3.3で最終決定されました。
例として、ここでは、ソーステキストファイルから情報を設定する2つの方法を使用して、画像の'label'と'comment'メタデータを設定し、レポートします。"info.txt"ファイルには、次の文字列が含まれています。 [IM Text](最終改行なし)。

  magick -label   @info.txt  rose:     -format '%l label'   info:
  magick -comment @info.txt  rose:     -format '%c set "'   info:
  magick rose: -set label   @info.txt  -format '%l caption' info:
  magick rose: -set comment @info.txt  -format '%c set "'   info:
[IM Text]
'@'ファイル読み込みエスケープを使用して読み込まれたエスケープ文字列は、IMによって展開されませんでした。これは、IMがファイルからテキストを読み取るたびに、ファイルに存在する特殊文字を処理しないことを意味するため重要です。
IMは、エスケープなしで、テキストファイルを文字通りのテキストとして読み込みます。
残念ながら、これには、読み込まれているファイル(またはストリーム)に存在する可能性のある最終改行も含まれます!入力テキストに最後に改行がある場合(非常に一般的な方法です)、結果の画像に余分な「空白」行が発生する可能性があります。例として…

  echo "Anthony" | magick label:@-  label_stdin.gif
[IM Output]
ご覧のとおり、ラベルには入力文字列だけでなく、「echo」コマンドによって最後に追加された改行文字による余分な空白行も含まれていました。最終改行を不要な場合は、自分で削除する必要があります。ただし、テキストのソースや作成方法、そして実行しているIMのAPIによっては、これは難しい場合があります。最適な方法は、そもそも最終改行を生成しないようにすることです。「echo」に'-n'フラグを使用するなど。

  echo -n "Anthony" | magick label:@-  label_stdin_2.gif
[IM Output]
または、特に要求しない限り、余分な改行を追加しないものを使用します。

  printf "Anthony" | magick label:@-  label_stdin_3.gif
[IM Output]
または、少し巧妙なperlのワンライナーを使用して、最終改行を「削除」することができます…

  echo "Anthony" | perl -0777 -pe 's/\n$//' |\
     magick label:@-  label_stdin_4.gif
[IM Output]
他のAPIでは、'パイプで開かれた'を介してテキストをIMコマンドに供給する前に、最終改行を探すことができます。

ユーザー定義のオプションエスケープ

大きな問題は、別の画像("label:"や"caption:"画像を生成する場合など)で、ある画像からエスケープされた情報を使用しようとすることです。これは非常に難しい問題であり、現在の解決策(単一画像の場合)は、処理中の画像に添付される特別な「ユーザーオプション」を作成することです。この「設定」は、必要に応じて、"label:"、"caption:"、または"-annotate"によってパーセントエスケープシーケンスとして参照できます。例として、ここでは、組み込みのrose画像の情報を使用して、完全に新しいラベル画像を作成します。その情報ソース画像はその後削除されますが、新しいラベルを元の画像に追加することも簡単にできます。

  magick rose: \
          -set option:roseinfo 'rose image\nsize = %w x %h\nwith %k colors' \
          label:'%[roseinfo]'  -delete 0   label_escape.gif
[IM Output]
上記の方法は複雑ですが、これは関係するIMコアライブラリの内部的な制限によるものです。詳細は他の画像からのデータへのアクセスを参照してください。

エスケープ文字のエスケープ

文字列をIMの引数として(特にAPI呼び出しとして)渡す必要があるが、IMでエスケープを展開したくない場合は、追加のバックスラッシュ'\'を使用して3つのエスケープをすべて「エスケープ」するだけで済みます。'@'は最初の文字の場合のみ「エスケープ」する必要があり、後方互換性のために、パーセントエスケープも2倍にすることでエスケープできます。つまり、'%%'は単一のパーセントを生成します。例として…

  magick -background lightblue -fill blue -font Candice -pointsize 48 \
          label:'\@ \\n \% 5%% '    label_escapes.gif
[IM Output]
IMバージョン6.3.2より前は、バックスラッシュを使用して最初の'@'をエスケープし、「ファイルからの読み込み」機能をオフにすることができませんでした。その場合、最初の'@'をエスケープする唯一の方法は、ファイルから読み取ることでした。これはAPIではあまり実用的ではありませんでした。
これは"-annotate"に関する同様の「エスケープのエスケープ」の例です…

  magick rose: -fill white -stroke black  -font Candice  -pointsize 20 \
          -gravity center   -annotate 0 '\@ \\n 5%%'  annotate_escapes.gif
[IM Output]
もちろん、前述のように、ファイルからテキストを読み取る('@'エスケープを使用する)場合、常に特別な意味を持たない文字通りのテキストとして扱われます。これにより、テキストの事前処理が不要になり、最終改行に注意するだけで済みます。

  echo -n '@ \n 5%' |\
    magick rose: -fill white -stroke black  -font Candice  -pointsize 20 \
            -gravity center    -annotate 0 '@-'   annotate_escapes_file.gif
[IM Output]
言い換えれば、ファイルから読み取る場合は、エスケープについて心配する必要はなく、IMで使用したいテキストを正確に記述するだけです。

旧バージョンのIMのエスケープ

上記の定義は、IMバージョン6.3.3で初めて確定されました。これ以前は、IMユーザーから送信された要求、問題、苦情に応じて、オプションによってはエスケープが処理される場合とされない場合がありました。これは、特に"label:"と"caption:"のパーセントエスケープに関して顕著で、しばらくの間「非合理的」とみなされていました。たとえば、次のラベル画像に'%c'が表示されるかどうかは、バージョンに大きく依存します(少なくともIM v6.3.3より前)。

  magick -background lightblue -fill blue -font Candice -pointsize 48 \
          label:'ab%cde'    label_percent.gif
[IM Output]
'abde'(パーセントエスケープが適用された)または'ab%cde'(パーセントが適用されなかった)が表示されるかどうかは、使用しているIMのバージョンによって異なります。
IM v6.2.4では、「非合理的」であるとして"label:"と"caption:"からパーセントエスケープが削除されました。

しかし、IM v6.3.2で、任意の画像を参照できる新しい'%[fx:...]コンストラクトとして復活し、画像へのテキスト生成におけるパーセントエスケープが再び有用になりました。FX式エスケープを参照してください。
この「何がエスケープされるか」は、ファイルからのエスケープの処理に関しても問題でした。IM v6.3.3より前では、以下は1行ではなく2行生成していました。

  echo -n ' Love \n/ Hate ' |\
    magick -background lightblue -fill blue -font Ravie -pointsize 18 \
            label:@-    label_escapes_file.gif
[IM Output]
エスケープ処理の結果はバージョンによって大きく異なるため、v6.3.3より古いIMでは、スクリプトがエスケープ処理をテストし、プログラムの動作に重要であれば調整することをお勧めします。*IMスクリプトの自動テストを作成したい方は、ご協力ください。または、そのようなテストが見つかった場合はお知らせください。*

Pango - 基本的な書式付きテキスト

"pango:"テキストコーダー(IM v6.7.6-3から完全に動作)は、LabelおよびCaptionコーダーとほぼ同じように機能します。Pangoがインストールされているシステムで、制限されたテキスト書式設定言語を提供します。LinuxとMacOSXシステムではpangoは標準で、Windowsではオプションです。特別なpango書式設定を使用しない簡単な例を次に示します…

  magick -background lightblue pango:"Anthony Thyssen" pango.gif
[IM Output]
ただし、テキストの書式設定要件により、以前のテキスト属性の一部はpangoでは機能しないことに注意してください。たとえば"-background"の色を設定できますが、デフォルトの塗りつぶしや下色、使用するフォントを具体的に設定することはできません。これは、これらの属性が代わりにPango Markup Languageを介して選択できるためです(下記参照)。出力画像の幅と高さの制限を定義するために"-size"を使用することをお勧めします。pangoはそれに合わせて入力テキストを自動的に折り返し(または中国語の場合は文字送り)します。

  magick -background lightblue -size 150 \
          pango:"Anthony Thyssen is the main author of IM Examples" \
          pango_size.gif
[IM Output]
Defineの"pango:justify"を使用して、Pangoでテキストを適切に揃えることもできます…

  magick -background lightblue -size 150  -define pango:justify=true \
          pango:"Contributions to IM Examples are welcome via the IM Forum." \
          pango_justify.gif
[IM Output]
ただし、テキストを揃えることができますが、スペースと改行はテキスト形式によって依然として考慮されることに注意してください。また、pangoはタブの使用を理解します(ラベルとキャプションとは異なります)。

  printf "col1\tcol2\nabc\txyz\n123\t789" |\
     magick -background lightblue  pango:@-  pango_tabs.gif
[IM Output]
'\t'エスケープを使用してタブ文字を生成できる上記の"printf"コマンドは、IMは理解していません。ただし、文字列内の'\n'エスケープシーケンスは理解します。
ただし、タブを使用して列を生成することは、APIの外で「タブストップ」を簡単に定義できないため、うまく機能しません。そのため、この方法でタブを使用することは、行と段落のインデントを除いて、**推奨されません**。

Pango Markup言語

ただし、pangoの真の威力は、デフォルトで有効になっている「Pango Markup」言語にあります。"-define pango:markup=false"を使用してpangoマークアップをオフにできますが、その場合はCaptionを使用するのと変わりません。「Pango Markup」はHTMLとよく似ており、テキストに隠された一連の"<...>"マークアップタグを使用して、テキストの書式設定方法を制御します。マークアップ言語に関するガイド(APIのジャンクなし)を次に示します。例として…

  magick -background lightblue -gravity center -size 180x \
          pango:"The <b>bold</b> and <i>beautiful</i>" \
          pango_formatting.gif
[IM Output]
"<span ... >"タグは、pangoマークアップで使用する主なタグです。含まれるテキストのサイズ、色、位置を正確に制御できます。例として…

  magick -background lightblue \
       pango:'  Some  <span size="49152" rise="-20480"
                foreground="red" background="blue"
                 > Big Red on Blue </span>  Text  ' \
       pango_span.gif
[IM Output]
ほとんどの数値は1024倍されていることに注意してください。そのため、上記の例で「size="49152"」の値は、テキストのポイントサイズが48ポイントを意味します。「rise="-20480"」の負のriseは、テキストの位置を20ポイント(72dpiでは20ピクセル)下げることを意味します。しかし、テキストのポイントサイズを指定する代わりに、「size="x-large"」のような特別なサイズラベルを使用することもできます。次の例のソースコードを参照してください。上記の引用符内の引用符に注意してください。タグ内の引用符は必須です。ただし、タグ内の改行と余分なスペースは、テキストのフォーマットには影響しません。そのため、マークアップタグ内、またはマークアップコメント「<!-- ... -->」内の余分な改行を隠すことは非常に役立ちます。再度、次の例のソーステキストを参照してください。Pangoフォーマットの威力の最終的な例として、ここでは事前に準備されたファイル「pango_test.txt」をフォーマットするために使用します。これには、おそらく使用する一般的なPangoマークアップタグの大部分が含まれています。このマークアップファイルと下にある結果の画像を比較してください。

  magick -gravity center pango:@pango_test.txt  pango_test.png
[IM Output]

Pango の注意点と問題点

重力
Pangoでテキストの単一行だけを選択的に中央揃えにすることができませんでした。「-gravity」設定を使用すると、すべてを中央揃えにするか、何も中央揃えにできません。これは、Pangoがアプリケーション用に個別のテキストラベルを生成するように設計されているためであるようです。つまり、タイトルは通常、表示テキストの本文とは別に生成されます。Pangoは、大規模なテキストページフォーマットエンジンとして意図されていません。
フォント
Pangoはレンダリング中にフォントを変更できます。太字や斜体のテキストでは既に簡単に変更されています。ただし、フォントの仕様はGTKからのものであり、そのためImageMagick全般とは異なるシステムを使用しています。「gtk-demo」プログラムを実行し、「Pickers」と「Text Widget」をダブルクリックすることで、GTKを使用したフォントの詳細を確認できます。
定義
Pangoテキストフォーマットのさまざまな側面をグローバルに制御するために使用できる、多くの特別な定義があります。これらは現在、疑似ファイル形式にリストされていますが、私自身はすべてを調べたわけではありません。私が使用したものは次のとおりです…
-define pango:markup=false
マークアップ言語タグをオフにします。すべてのタグが出力に含まれます。テキスト内のPangoフォーマットは不可能です。これはデバッグに特に役立ち、Pangoが入力として認識するものを正確に確認できます。
-define pango:justify=true
テキストを画像サイズの幅全体に揃えます。つまり、単語間のスペースを追加して、テキストブロックの左右の端を揃えます。

Pangoの詳細情報

可能なことを確認するには、Pangoスクリプトギャラリーを参照してください。Pangoで何か興味深いことを行ったら、ぜひご協力ください。メール(ページフッターのアドレス)を送信するか、IMディスカッションフォーラムに投稿してください。
Pangoがインストールされているシステムでは、「pango-view」コマンドを使用してPango形式の画像を生成することもできます。ただし、そのデフォルトの「密度」または「dpi」設定はディスプレイ(IMはデフォルトで72dpiを使用)であるため、ホストによって異なる場合があります。

テキスト - プレーンテキストのページ

text:」入力形式は、プレーンテキストを、テキストのページごとに1つの画像からなる画像に変換するように設計されています。ImageMagickの「ページテキスト」入力演算子です。言い換えれば、その目的は、プリンターがプレーンテキストを別々の紙に印刷するのとほぼ同じ方法で、より大きなプリフォーマットされたテキストファイルをページに変換することです。
text:」ファイル入力形式と同様の「txt:」入力形式を混同しないでください。後者は、最初にファイルを「IMピクセル列挙」画像形式として読み込もうとします。

.txt」のプレーンテキストファイルが失敗するという意味ではありません。実際、列挙された画像が認識されない場合、「txt:」ファイル形式は自動的に「text:」形式にフォールバックするため、そのようなファイルはおそらく期待どおりに変換されます。

ただし、このようにテキストを処理することにはいくつかの問題がありました。まず、テキストは大きなキャンバスに描画されるため、不要なスペースを削除する必要があるという問題があります。もう1つは、行が「ワードラップ」されないため、長すぎる場合はキャンバスからはみ出して切り捨てられることです。最後に、非常に長いテキストファイルの場合、追加の予防措置を取らない限り、複数のページ(画像)が生成されます。一方、「text:」は、生成される最終的な画像サイズを変更したり、非常に長い行をワードラップしたりすることなく、ほぼすべてのテキストファイルを処理します。コマンドラインでテキストを使用する場合のように、特殊文字を事前に処理する必要もありません。最後に、そしてより重要なことに、固定幅フォント(Courierなど)を使用する場合、データのスペースが空いている列を持つファイルは、データがスペースが空いている列のままになります。基本的に、「text:」は入力ファイルを「現状のまま」変換します。
ファイルから読み取られた入力テキストデータは、基本的にフォントライブラリに直接渡されてUTFテキストを描画します。この結果、一部の制御文字は、珍しい「グリフ」を使用して描画される場合があります。これには、TAB文字とFORMFEED文字が含まれますが、執筆時点では「freetype」ライブラリが誤って認識しています。

これが問題になる場合は、「expand」などのフィルタープログラムを使用してテキストファイルを事前に処理し、TAB文字を適切な数のスペースに変換することをお勧めします。
テキストを描画するとき、「-page」を使用して指定されたページサイズまたはタイプ(現在の解像度(「-density」で設定))の大きな「レター」サイズのページが作成されます。デフォルト(72dpiの場合)はサイズが「612x792」ピクセルになり、ほとんどの場合非常に大きくなります。たとえば、これは「magick」コマンドのプレーンテキスト形式のマニュアルを画像に直接変換したものです(大きいため、右側の「ページ」画像を選択して表示してください)…

  man magick | col -b | expand | \
    magick -font CourierNew  text:- -delete 1--1 text_manpage.gif
[IM Output]
ただし、上記のマニュアルから画像への変換では複数のページ(画像)が生成されるため、すべてのページのGIFアニメーションではなく、最初のページだけを残すために2番目以降のページを削除しました。

IMに生成された最初の画像だけを読み取るように指示するために、「text:-'[0]'」などの読み込み修飾子[0]」入力ファイル名を付加することもできました。ただし、現時点では、すべてのページの選択は、すべてのページを生成して不要なページを削除することで処理されています。
印刷されたページにある文字間隔のフォーマットを保持するために、上記では意図的に「CourierNew」という「固定幅」フォントを使用しました。この出力は、上記のキャプション:の出力とどのように異なるかに注目してください。この画像の全体的な外観は、次に示すPostscriptセクションで説明されているのと同じ手法を使用することで改善することもできます。「A5」ページのサイズが100dpiでどのくらいであるかを知りたいだけの場合、このコマンドは、そのサイズの空白ページを1つ生成し、そのサイズをピクセルで返します。「/dev/null」というファイル名は、常に空である特別なUNIXファイルです。

  magick -page A5 -density 100 -units PixelsPerInch  text:/dev/null \
          -format 'Page Size at %x = %w x %h pixels'  info:
[IM Text]

テキストページのトリミング

テキストは大きなキャンバスに「描画」されているため、生成された未使用のスペースを削除したい場合があります。これは、画像操作「-trim」、「+repage」を使用して実行し、次に合理的に見せるために、「-border」を使用してエッジスペースを追加します。もちろん、「-background」色を再追加する「-bordercolor」と一致させる必要があります。複雑そうに聞こえますか?実際にはそうではありません。たとえば…

  echo "    Hello Cruel World    " |\
    magick -background  lightblue  -fill blue  -pointsize 18 \
            text:-    -trim +repage  -bordercolor lightblue  -border 3 \
            text_trimmed.gif
[IM Output]
上記の例では、「-trim」を使用して、「text:」ページ画像の非常に多くの余分な空白スペースを削除しています。ただし、これにより、行の先頭にあるスペースも削除されます!ただし、ページに描画された実際のテキストのサイズ(入力の先頭と末尾のスペースを含む)に画像を「-trim」で切り詰めることができる興味深い手法があります。これは、特別な「-undercolor」設定(後で詳細に説明します)を使用します。

  echo "    Hello Cruel World    " |\
    magick -background  white -undercolor lightblue  -fill blue \
            -pointsize 18   text:-  -trim +repage \
            -bordercolor white  -border 3    text_boxed.gif
[IM Output]
テキストの下部にある余分なスペースは、テキスト入力の最後の「改行」文字が原因で、画像に余分な空行が作成された結果です。しかし、ご覧のとおり、入力テキストの先頭と末尾のスペースは保持されています。上記で透明な背景色を使用すると、トリミングされた画像をフラット化して、使用した「undercolor」と同じ色に描画されていない領域を変換できます。

  echo "    Hello Cruel World    " |\
    magick -background  none  -undercolor lightblue  -fill blue \
            -pointsize 18   text:-  -trim +repage  \
            -bordercolor lightblue  -border 3 \
            -background lightblue  -flatten    text_box_trimmed.gif
[IM Output]
上記の結果(追加された「-border」を除く)は、実際には「label:」を使用して「@」エスケープされたファイル名から読み取ることで、IMが現在生成しているものとほぼ同じです。ただし、「label:」は、(Postscript変換ではなく「freetype」ライブラリを介して)より高速で、はるかにクリーンな方法で実行します。次の例のように、ピクセル単位(次の例を参照)、またはメディアページサイズ(「A5」など)を使用して、より小さな「-page」サイズを指定できます。「-density」またはピクセル解像度設定を使用します。左上の隅を基準にして、ページ上のテキストの描画を開始するオフセットを指定することもできます。たとえば…

  echo "This is a long line that shows that 'text:' does not word wrap." |\
     magick -background  lightblue  -pointsize 18 \
             -fill blue  -page 320x95+50+10  text:-'[0]' +repage  text_page.gif
[IM Output]
ほとんどの他の画像作成演算子は、「-page」設定を使用して、より大きな仮想「キャンバス」と、そのキャンバス上の画像の「オフセット」を設定します。これは一般的に、画像をレイヤー化したり、アニメーションを生成したりするためです。このため、「text:」または「ps:」操作の後で「+page」を使用してページ設定をリセットすることをお勧めします。そうしないと、後で同じコマンドラインで読み込む2番目の画像で予期しない結果が得られる可能性があります。

そのため、上記の例に「+repage」演算子を追加しました。追加しないと、テキストがオフセットされ、生成された画像もオフセットされます!

このオフセットの使用の詳細については、ページ画像属性を参照してください。
最後の例で、ページ幅に収まらないテキスト行はページからはみ出し、「折り返し」されません。これにより、行末が事実上切り取られ、破損します。また、行数が多すぎると、「text:」は*複数ページ*、ひいては*複数の画像*を生成します。これは、テキストファイルのPostScript変換によって生成された各ページに対応する画像が作成されるためです。テキストの最初のページのみに関心がある場合、または複数の画像が生成される可能性を回避したい場合は、「text:」のファイル名に「[0]」を追加して、IMにテキストが画像に変換された*後*に生成された最初のページのみを読み込ませます(前の例を参照)。

PostScript/PDF - 事前フォーマット済みテキストとグラフィック入力
(またはその他のベクター画像形式)

以下は、標準的なベクター画像処理手法を示しています。これは「PS:」(PostScript)画像だけでなく、ベクターグラフィックを使用して処理されるその他のすべての画像に使用できます。「PDF:」(Portable Document Format)、「TEXT:」(ページ付きプレーンテキスト)、「SVG:」(スケーラブルベクターグラフィック)、「WMF:」なども含まれます。この方法は拡張して、テキストが画像としてどのように表示されるかを非常に細かく制御できます。たとえば、適切な「テキストからPostScriptへの」フィルタを使用すると、ワードラップ、ジャスティフィケーション、複数のフォントの処理、太字、枠線、タイトル、ファイル名、日付、その他の装飾をPostScript画像で制御できます。ただし、このセクションはテキストから画像への変換についてであるため、最初にテキストをフォーマットされたPostScriptファイルに変換する必要があります。これを行うために使用できる外部プログラムはたくさんあります。「a2ps」、「enscript」、または「pstext」などです。基本的に、ワードプロセッサ(「OpenOffice」や「Word」、あるいは「Notepad」など)を使用するか、バッチテキスト処理システムが必要な場合は、「TeX」や「LaTeX」を使用して事前フォーマットされたテキストを生成できます(下記の完全なテキスト処理システムを参照)。これらのプログラムはすべて、プレーンテキスト、太字、異なるサイズとフォントのテキストの混合、ワードラップ、ジャスティフィケーション、段落制御の複雑さを処理するように設計されています。これらのプログラムからの出力は、次にIMに渡して、必要なサイズと品質の画像に変換できます。そこで、まずPostScriptを生成してみましょう(個人的なフォーチュンプログラムからのテキストを変換します)。

  mesgs LN-ManKzinWars | \
    a2ps -q -1 --rows=10 --prologue=bold \
         --center-title="Postscript via 'a2ps'" \
         --header='' --left-footer='' --right-footer='' \
         -o ps_version.ps
[IM Output]
これで、それを画像に変換し、結果をトリミングできます(上記の「text:」の例のように)。これにより、生成されたデフォルトのページ/キャンバスから余分な空白領域が削除されます。

  magick ps_version.ps'[0]' \
          -trim +repage   -bordercolor white -border 3  ps_version_raw.gif
[IM Output]
入力を最初のページのみに制限するために「[0]」を使用することに注意してください。PostScript画像が複数のページを生成する場合でも、「ghostscript」デリゲートによって完全に処理されますが、IMは返された最初の画像のみを読み取り、ページごとに複数の画像を生成することはありません。PostScriptが非常に大きい場合は、他のPostScriptユーティリティを使用してページ数を制限してから、IMと「ghostscript」で処理することをお勧めします。ご覧のとおり、デフォルトの「-density」72dpiに変換されたPostScriptは、アンチエイリアシングが最小限であるため、期待どおりには表示されないことがよくあります。これは、これらの低解像度では機能しないように設計されているPostScriptフォントを扱う場合に特に当てはまります。これを改善するには、「スーパーサンプリング」手法を使用して、より高品質な画像を生成できます。この場合、「ghostscript」に、より高い解像度(または画像「-density」)でページを描画するように指示します。次に、「-resample」(特殊なリサイズ)を使用して、このより大きな画像をより「通常の」画面解像度密度に戻すことができます。

  magick -density 196   ps_version.ps'[0]' -resample 72 \
          -trim +repage   -bordercolor white -border 3  ps_version.gif
[IM Output]
値「196」は最終的な72dpiの3倍です。「-resample」を使用すると、約3×3ピクセルが各ピクセルにマージされます。これにより、テキストのエッジに沿ってより優れたアンチエイリアシングピクセルが生成され、結果全体の外観が向上します。また、より大きな密度または解像度を使用することは、フォントを拡大するだけとはまったく同じではありません。フォント定義には、低解像度状況を処理するための調整が含まれている場合があります。たとえば、2つの画像の文字「e」の穴を比較してください。元のバージョンは、フォント内の特別な処理により、全体的には後者のスーパーサンプリングされたバージョンの方がクリアであるにもかかわらず、よりシャープです。詳細については、下記の解像度、ポイントサイズ、実際のフォントサイズを参照してください。必ずしも上記の値を使用する必要はなく、場合によってはわずかに異なる値の方が、より良い、またはより望ましい結果が得られる場合があります。もちろん、「ghostscript」で2倍、3倍、または4倍大きい画像を生成するということは、IMが画像の生成に4倍、9倍、または16倍の時間がかかることを意味します!メモリと一時ディスク領域もそれだけ多く使用されます!しかし、その結果は一般的にそれだけの価値があります。最適な方法は、独自のドキュメントで試してみて、最適な結果を得る方法を確認することです。また、より多くのアンチエイリアシングが必要な場合は、より大きな入力解像度を使用する代わりに、サイズを縮小する前に、サブピクセル量(たとえば「-blur 0x0.7」)だけ画像をぼかすことができます。リサイズ後のわずかなアンシャープ処理(一般的なPhotoshopテクニック)も、最終的な結果全体を向上させることが時々あります。

  magick -density 196   ps_version.ps'[0]' \
          -blur 0x0.7 -resample 72 -unsharp 0x0.7 \
          -trim +repage   -bordercolor white -border 3  ps_unsharp.gif
[IM Output]
ただし、これらの調整には注意が必要です。状況を悪化させる可能性があります。
白い背景ではなく透明な背景が必要な場合は、「-channel」設定に「RGBA」を指定して、画像にアルファチャネルを含めます。もちろん、半透明の色を処理できる画像形式を使用する必要があります。

  magick -channel RGBA -density 196  ps_version.ps'[0]' -resample 72 \
          -trim +repage   -bordercolor none -border 3  ps_transparent.png
[IM Output]
バナーはまだ、透明または半透明になるのではなく、オフホワイトの色を背景に使用していることに注意してください。これは、生成されたPostScriptが実際にはその背景を描画し、ページのデフォルトの背景(白または透明)を置き換えるためです。このように背景を透明にすると、特定の背景色にPostScript画像を重ねることができます。

  magick ps_transparent.png -background skyblue -flatten  ps_bgnd_color.gif
[IM Output]
アルファ合成方法を使用すると、特定の背景画像やタイル状の背景に重ねることができます。

  magick composite -tile bg.gif  ps_transparent.png  -compose DstOver \
            ps_bgnd_tiled.gif
[IM Output]
ほとんどすべてのPostScriptプリンタは、紙またはOHPシートを暗くするだけなので(カラープリンタを含む)、上記を印刷すると、バナーは自動的に半透明になります。プリンタと同じことをIMにさせたい場合は、特別な「Multiply」アルファ合成を使用して、「白い背景」画像を目的の「紙」背景に重ねることができます。

  magick composite -tile bg.gif  ps_version.gif  -compose Multiply  ps_multiply.gif
[IM Output]
カラースのPostScript画像がある場合は、特別な「BumpMap」合成方法を使用して、色の付いた紙への純粋な白黒プリンタをシミュレートすることもできます。これにより、画像を合成するために乗算を使用する前に、ソースのオーバーレイ画像がグレースケールに変換されます。OHPシートのスライドに相当するグレースケール画像を生成することもできます。これは基本的に、上記の「不透明な白い背景」画像を「マスク」として使用し、アルファシェイプ演算子を使用して、シェイプされた透明な画像を設定します。

  magick ps_version.gif -negate -background black -alpha shape  ps_overhead.png
[IM Output]
上記の「text:」コンバータと同様に、「ps:」コンバータも「-page」設定を使用して、ページが描画される画像「メディア」のキャンバスサイズを設定します。ただし、指定されたオフセットは無視されます。ただし、ほとんどのPostScriptファイルは描画メディアサイズを内部的に定義しているため、通常は必要ありません。
他のほとんどの画像作成演算子は、「-page」設定を使用して「仮想キャンバス」とその仮想キャンバス上のオフセットを設定します(たとえば、GIFアニメーションを生成する場合)。そのため、「text:」または「ps:」画像の読み込み操作に使用した後は、「+page」を使用してリセットすることをお勧めします。そうしないと、後の画像で予期しない結果になる可能性があります。

このオフセットの使用の詳細については、ページ画像属性を参照してください。
最後の実践的な例として、私のレイトレーシングされた正四面体画像をご覧ください。同様の画像は多面体に関する研究で見ることができます。背景ページは、表示されている3D数学オブジェクトの生成に使用されたものと同じデータから生成されました。テキストデータは「a2ps」を使用して変換され、次にIMを使用して画像に変換されました。この画像に、同じ数学オブジェクトの事前に準備された線画がページに追加されました。この最終画像('targa'またはTGA形式で保存)は、次に「PovRay」レイトレーサに渡され、最終画像またはレイトレースされたシーンに組み込まれました。

GhostScriptの直接使用

これは厳密にはIMではありませんが、Richard Bollingerは、「ghostscript」デリゲートを直接実行する方がはるかに効率的で、ファイル処理が少なくなるため、処理速度が桁違いに向上すると報告しています。たとえば、次を実行する代わりに...

  magick -density 300x300 -compress Group4 file.ps  file.tif
GhostScriptに直接実行させることができます。

  gs -dBATCH -dNOPAUSE -sDEVICE=tiffg4 -r300x300 \
     -sOutputFile=file.tif  file.ps
これにより、IMが大きな一時ファイル(セキュリティとパイプライン化された画像処理のため)を生成する必要がなくなります。この結果、GhostScriptを直接使用することで、ファイル処理とIO処理を大幅に削減でき、PostScriptとPDFファイルの処理において大幅なパフォーマンス向上を実現できます。ただし、「ghostscript」は画像サイズを変更することはできません(出力密度または解像度を調整する以外)そして、おそらく必要な画像ファイル形式または必要な品質で画像を出力することはできません。しかし、タスクを完了するためにGhostScriptの出力をImageMagickに渡すことができます。特に、結果をスーパーサンプリングする場合(高解像度の入力から低解像度の出力にリサイズする場合)です。GhostScriptは、使用方法を理解したり、特定の種類のPostScriptを修正したりするのが難しいプログラムになる可能性があります。CristyはIMユーザーの代わりにこれらの問題と常に戦っており、彼はそこで素晴らしい努力をしています。残念ながら、発生する可能性のある(そして実際に発生する)多くのことを処理する際に、IMはGhostScript経由のPostScript/PDFのための簡素化された方法を提供できません。

Draw - 既存のキャンバスにテキストを描画

低レベルの「-draw」演算子を使用してフォントを描画することにより、特にフォントの正確な位置と、それが描画される画像のサイズに関して、より多くの制御が可能になります。

  magick -size 320x100 xc:lightblue  -font Candice -pointsize 72 \
          -fill blue  -draw "text 25,65 'Anthony'" text_draw.gif
[IM Output]
しかし、これを使用するには、フォントを描画するのに適切なサイズの背景画像を生成する必要があります。これは、不明なテキストを描画する場合に困難になる可能性があります。この問題の解決策については、「フォント画像の自動サイズ調整」を参照してください。標準のテキストオプション以外にも、多くの追加オプションが「-draw」による画像へのテキストの描画方法に影響します。「-fill」の色を指定できるだけでなく、「-undercolor」を指定することもできます。また、エッジまたは「-stroke」の色も指定でき、どちらもデフォルトではオフになっています('none'の色に設定されています)。「-fill」の色は「-tile」画像パターンで置き換えることができ、「-strokewidth」を使用してストロークのエッジ幅を変更できます。次に、「-gravity」設定を使用して、描画されたテキストの相対位置を変更できます。たとえば、ここでは、上記で説明した多くの追加機能を使用しました。

  magick -size 320x100 xc:lightblue  -font Candice -pointsize 72 \
          -tile bg.gif  -undercolor dodgerblue  -stroke navy  -strokewidth 2 \
          -gravity center  -draw "text 0,0 'Anthony'" text_options.gif
[IM Output]
IM バージョン 6.2.4 以降、「-draw text」操作では、'\n'を改行として使用したり、パーセント'%'の画像情報エスケープを使用したりすることはできなくなりました。(「パーセント記号の描画のバグ」を参照してください)。

これらの機能と問題は、新しい IM v6 演算子「-annotate」で使用できます。「アノテーションテキスト描画演算子」を以下に示します。
上記のすべてのオプションは、「-draw」(MVG - Magick Vector Graphic)文字列内でも使用できます。ただし、描画引数の内部で上記のオプションを設定した場合、そのオプションは、その特定の描画 MVG 文字列にのみ適用されます。これに加えて、draw MVG 形式は、テキストの回転やフォントの「装飾」など、はるかに多くのことができます。もちろん、円などのさまざまな図形を画像に描画することもできます。たとえば、ここでは、いくつかの背景円の上に重ねて、下線が引かれ、回転されたテキストを描画します。

  magick -size 320x120 xc:lightblue \
          -draw "fill tomato  circle 250,30 310,30 \
                 fill limegreen  circle 55,75 15,80 \
                 font Candice  font-size 72  decorate UnderLine \
                 fill dodgerblue  stroke navy  stroke-width 2 \
                 translate 10,110 rotate -15 text 0,0 ' Anthony '" \
          draw_mvg.gif
[IM Output]
画像の作成に「-draw」を最大限に活用したい場合は、「描画例ページ」を参照することをお勧めします。

下色ボックス

上記および後述のように、「-undercolor」の色設定は、その文字とフォントの定義された描画領域を色付けします。一般的に、描画された文字にぴったりと合います。これは、描画されたフォントの左右のエッジに特に当てはまります。上部と下部エッジは通常、すべての文字を収容するのに十分な大きさであるためです。描画領域は基本的に、フォントが描画される領域を囲む文字の「セル」境界を表します。「-undercolor」オプションを使用する主な目的は、テキスト周辺の「ノイズの多い」背景をシンプルかつ迅速にクリアする方法です。たとえば、「画像上へのアノテーション」を参照してください。ただし、その場合は、描画する文字列の先頭と末尾に追加のスペース文字を追加することをお勧めします。

境界ボックスのオーバーフロー

テキストを描画する場合、またはフォントを一般的に処理する場合に遭遇する可能性のある最大の課題の1つは、すべてのフォントが通常のルールに従うわけではないということです。フォントデザイナーは、現在のテキスト位置(キャレットと呼ばれる)に対して相対的に任意の場所に個々の文字(または「グリフ」)を描画できます。フォントの位置は前方に移動する必要はなく、一部の国際フォントでは後方に移動することもあります!このデザインの自由の結果として、一部の「グリフ」は、フォントが文字が収まることを宣言する定義済みの描画領域に収まらない場合があります。特に、文字の一部が境界の外に大きく広がり、後続(または先行)文字で使用される領域にまで及ぶ、斜体または筆記体のようなフォントの場合です。この点で私が見た最悪のフォントは「LokiCola」フォントで、大文字の約半分を長い波状の尾で描画し、個々の文字セルの境界をはるかに超えています。このフォントは基本的に、大文字の後に3つ以上の子音文字が続くことを前提としています。これを示すために、フォントの大文字をいくつか個別に描画して、文字がセルの「下色」または描画境界を超えてどの程度まで広がる可能性があるかを示します。また、それらを使用してフォントの名前を作成し、設計どおりに使用された様子と、境界ボックスを超えてしまう理由を示します。

  magick -size 500x200  xc:lightblue \
          -font LokiCola  -pointsize 72  -undercolor dodgerblue \
          -draw "text  15,65 'L'"   -draw "text 130,65 'C'" \
          -draw "text 245,65 '1'"   -draw "text 360,65 'H'" \
          -gravity South -draw "text 0,10 'Loki Cola'"    draw_undercolor.gif
[IM Output]
また、「H」が描画領域の左側と右側の両方でオーバーフローしていることにも注目してください。これにより、行の先頭で使用するのが難しくなる可能性があります。
この問題は、IMのバグではなく、IMが使用するフォントライブラリとフォント自体の設定(通常はフォントデザイナーによる意図的なもの)の相互作用によって発生します。IMは、プログラムされた結果をそのまま使用しますが、必ずしもユーザーが意図した結果になるとは限りません。したがって、珍しいフォントを使用する場合は注意が必要です。

アノテーション - テキスト描画演算子

IM バージョン 6 では、新しいフォント描画演算子「-annotate」が利用可能になりました。この演算子は、「-draw text」操作を使用する場合よりもはるかに単純ですが、「annotate()」API(アプリケーションプログラミングインターフェース)を使用するため、より強力でもあります。この演算子は「-draw」プリミティブを使用しますが、特別なエスケープ文字を展開して追加の画像情報や複数行を追加したり、描画されたテキストに座標系変換を適用して傾斜や回転を作成したりするなど、より複雑な方法で行われます。このため、この演算子は現在、すべての ImageMagick テキスト描画と画像アノテーションで推奨されるテキスト描画演算子であり、これらの例ページにも反映されています。この演算子を使用した基本的な例を以下に示します。

  magick -size 320x100 xc:lightblue -font Candice -pointsize 72 \
          -fill blue  -annotate +25+70 'Anthony'    annotate.gif
[IM Output]
-annotate」演算子の追加機能の1つは、描画されたテキストのX軸とY軸を互いに完全に個別に回転できることです。これは、各軸を回転させる角度を演算子の引数で「画像サイズ」として指定することによって行われます。「-annotate」操作が1つであるにもかかわらず、どの程度複雑になるかを示すために、ボックス化され、ストロークされ、傾斜した画像を以下に示します…

  magick -size 320x100 xc:lightblue -font Candice -pointsize 72 \
          -tile bg.gif  -undercolor dodgerblue   -stroke navy -strokewidth 2 \
          -annotate 0x20+20+67 'Anthony' annotate_opts.gif
[IM Output]
この例では、4つのアノテーション引数がすべて指定されています。具体的には、X軸回転、Y軸回転、および背景画像上のフォントのX位置とY位置です。また、「-tile」で設定された塗りつぶしパターンもフォントと共に傾斜していることに注意してください。つまり、せん断/回転座標系を使用して描画されるため、描画されたテキスト内でせん断および塗りつぶしパターンがタイル状に配置されます。このせん断機能のさらなる例として、「せん断されたシャドウフォント」の例があります。それを同等の「-draw」MVG文字列で作成された「傾斜フォント」と比較してください。「-annotate」せん断操作の影響をまとめた表については、「アノテーション引数の使用方法」を参照してください。たとえば、わずかに回転したテキストを以下に示します…

  magick -size 320x100 xc:lightblue -font Candice -pointsize 72 \
          -annotate 350x350+20+90 'Anthony' annotate_rotated.gif
[IM Output]
-annotate」に指定された角度は、IMが正しく理解するために正でなければなりません。ただし、コンマ区切りの4つの数値形式のジオメトリ引数が使用される場合は例外です。たとえば、「-annotate '-10,-10,20,90' 'Anthony'」は、最後の例で使用できます。
これは、角度の付いた凝縮されたラベルを生成するために使用できます。例を以下に示します…

  magick -size 100x60 xc:skyblue \
          -annotate 300x300+20+50 "First" \
          -annotate 300x300+35+50 "Second" \
          -annotate 300x300+50+50 "Third" \
          -annotate 300x300+65+50 "Fourth" \
          -annotate 300x300+80+50 "Fifth" \
          annotated_labels.jpg
[IM Output]
エスケープ文字を使用して、アノテーション文字列に現在の画像に関する他の情報も追加できます。たとえば、組み込みの「rose:」画像を画像のサイズに関する情報で上書きしてみましょう。画像の中央にテキストを配置するには、「-gravity」設定を使用し、「-annotate」引数に'0'を使用して、すべての回転とオフセットをオフにします。

  magick rose: -fill white -stroke black  -font Candice -pointsize 20 \
          -gravity center   -annotate 0 '%wx%h\nPixels'    annotate_rose.gif
[IM Output]
詳細については、以下の「テキスト引数内の特殊なエスケープ文字」を参照してください。さまざまな方法でより大きな画像にテキストのアノテーションを追加する他の例(たとえば、側面の中央に配置したり、右下隅に回転したりするなど)については、「実用的なテキストアノテーションの例」を参照してください。

自動的にサイズ調整されたアノテーションテキストキャンバス

多くの場合、「label:」が提供できるものよりも多くの制御が必要です。たとえば、タイルまたはグラデーション画像を使用する場合、アノテーションでテキストを追加する必要があります。残念ながら、その場合、アノテーションテキストに必要なキャンバスのサイズを事前に知る必要があります。これが、問題の典型的な例です。最初にこのコマンドを設定したとき、目的の結果にサイズを設定し、最初はうまく機能しました。しかしその後、次のような結果になりました…

  magick -size 480x80   gradient:yellow-green \
          -font ArialBkI -pointsize 70 -tile gradient:blue-red \
          -annotate +10+65 'Gradient Fun'    funfont_gradients.jpg
[IM Output]
残念ながら、キャンバスのサイズを推測したときに、上記の単語「Gradient」を誤ってスペルミスしました(文字「i」が欠けていました)。もちろん、そのスペルを修正すると、画像のサイズが間違ってしまい、上記のように不正確な結果が生成されました。「-annotate」演算子を使用する必要がありますが、キャンバスのサイズがアノテーションテキストに合わせて調整されます。1つの解決策は、はるかに大きなキャンバスを使用してから、「トリミング」して背景を適切なサイズに調整することです。また、フォントと画像の最終エッジの周りに少し余白を追加して「ボーダー」を追加し、見た目を向上させました。

  magick -size 800x120 xc:black -font Corsiva -pointsize 100 \
          -tile tile_disks.jpg   -annotate +20+80 'Psychedelic!' \
          -trim +repage  -bordercolor black  -border 10   funfont_groovy.jpg
[IM Output]
この方法は、最終的な画像のサイズを推測しようとするよりもはるかに優れています。ただし、「Canvas Trim」は、タイル状の多色の背景をトリミングしません。より良い解決策は、「label:」を使用して適切なサイズのキャンバスを作成することです。「Draw Color Fill」を使用して画像をキャンバス(およびラベルテキスト)全体にタイル状に配置し、最後に「Annotate」を使用してテキストに別のタイル状の画像を適用します。

  magick -font Ravie -pointsize 72  label:'Get Wet!' -border 10 \
          -tile tile_aqua.jpg   -draw "color 0,0 reset"  \
          -tile tile_water.jpg -gravity center -annotate +0+0 'Get Wet!' \
          autosize_wet.jpg
[IM Output]
中央揃えの「label:」画像内のテキストの位置は、「-annotate」操作の中央揃えの位置と完全に一致しない場合があります。2つの方法は完全に異なる処理アルゴリズムに従うため、一致しない可能性があります。特に、特殊なフォントを使用する場合。

「アンダーカラーボックス」を使用した自動サイズ調整

label:」画像を使用する代わりに、「アンダーカラーボックス」と「太いストローク幅」を使用して大きなキャンバスにフォントを描画し、その後、キャンバスをトリミングしてサイズを調整できます。例えば

  magick -size 500x100 xc:lightblue -font SheerBeauty -pointsize 72 \
     -gravity center -undercolor white -stroke none -strokewidth 3 \
     -annotate +0+0 ' Invitation ' -trim +repage -shave 1x1 \
     invitation_box.jpg
[IM Output]
フォントの周りのスペースの量は、「-strokewidth」設定を使用して調整できます。唯一の重要な要件は、初期キャンバスの色が背景色(この場合は「lightblue」)とは異なり、最終結果よりも大きいことです。警告として、一部のフォントは、個々の文字の描画領域の外側に文字を描画します。(例として、上記の「アンダーカラーボックス」を参照)。この場合、上記の結果は機能しますが、透明なキャンバスを使用し、その後結果を白の上に重ね合わせる(例:「-background white -flatten」などの操作を使用)必要がある場合があります。使用されていない、そしてまだ透明な領域を白に変換するために。しかし、その文字は結果画像の端に触れている可能性があります。基本的に、すべての状況で本当に勝つことはできません。最善を尽くしてください。

グレースケールテキスト画像の色付け

上記のイメージは、意図的にグレースケールの白黒画像として生成されています。これは、マスクテンプレートとして使用できます。このような純粋な画像から、画像の背景と前景を別々に、または同時に着色できます。ここでは、例えば、「+level-color」という「レベルバイカラーオペレーター」を使用して、画像の色をグローバルに変更し、前景と背景の色に特定の値を割り当てます。

  magick invitation_box.jpg -colorspace sRGB \
          +level-colors navy,lightblue invitation_colored.jpg
[IM Output]
例えば、ここでは「コンポジットマスキング」を使用して、パターン画像で背景と前景を置き換えます。

  magick invitation_box.jpg -colorspace sRGB \
          \( +clone -size 300x150 -tile gradient:LightYellow \
                                             -draw "color 0,0 reset" \) \
          \( +clone -size 300x150 -tile plasma:tomato \
                                             -draw "color 0,0 reset" \) \
          -reverse  -composite      invitation_rose.jpg
[IM Output]
上記での「リバースオペレーター」は、画像の順序を変更するために使用されます。そのため、最初の画像がコンポジションの3番目の「マスキング」画像になります。次に、前景(「plasma:」)画像が最初に、背景が中央になります。このようなグレースケール画像の着色の他の手法については、「マスクを使用して合成領域を制限する」を参照してください。そして、より一般的には「画像でのマスクの使用」を参照してください。タイルに使用されるグラデーションの生成方法については、「色のグラデーション」、「まばらな色の点」、および「ランダム化されたキャンバス」を参照してください。

フォント

建設中
As for ordering the font paths, that is simply ordering the fonts specified in
the XML files.

The start point is the system fonts, followed by the system installed
"type.xml" file, on my system this is "/etc/ImageMagick-6/type.xml".

This system installed "type.xml" file is typically just a list of 'include'
other type-* files.  And the order of the includes will specify the order of
Extra System Fonts, verses Ghostscript Fonts.

After that file other "type.xml" files are looked for, such as in 'home'
directories, or even current directory.

Later fonts will NOT replace earlier fonts, as such if two fonts have that
same name, only the first one will be noted by IM. (a security measure).

To see the fonts loaded use
    magick -list font

It lists "Path:" of the type file each font list was found in, but the
paths are listed in REVERSE order, with system fonts at the end.

I have for example a personal Font named "Courier", but it is not listed in
the above list as it was defined after the "Courier" that was found in the
"System Fonts" area, (which is listed at the end of the above output).

On the other hand my own personal font "CourierNew", is listed, as it does not
clash with any system or system config defined font.

To see what font glyph file is selected for soem specific request
use...
  magick -debug annotate xc: -font Courier \
          -annotate 0 'Test' null: 2>&1 |
    grep '^ *Font '

フォントメトリクスの決定APIを使用せずに

[図] 特定のフォントとその個々の文字には、多くの情報が含まれています。そのような情報は、特に多くの異なるフォントのテキストを組み合わせるためにIMを使用する場合に非常に役立ちます。また、ほとんどのフォントはプロポーショナルフォントであることを覚えておくことが重要です。つまり、各文字には幅が異なり、「自然な」キャレット(または原点)の進みが異なります。そのため、特定の文字列は、文字列で使用される実際の文字数に関係なく、異なる長さにレンダリング(描画)されます。この例外は、「Courier」、「Typewriter」、または「Terminal」フォントなどの「固定幅」フォントであり、すべての文字の幅が同じであるため、テキストの列を簡単に生成できます。「デバッグ設定」の「-debug annotate」を使用して、IMに特定の文字列のTTFフォントのメトリクスを直接レポートさせることができます。例えば…

  magick -debug annotate  xc: -font Candice -pointsize 24 \
          -annotate 0 'Test' null: 2>&1 |\
    grep Metrics: | fmt -w80
[IM Text]
ご覧のとおり、原点に対する描画文字列の宣言された境界(必ずしも文字列の実際の境界ではない)、次の文字列を描画する前に「キャレット」(原点)を進める量など、使用できるさまざまな情報が得られます。完全なデバッグ出力(かなり冗長であり、上記には示されていません)には、実際に使用されているフォントファイル(2回)もレポートされるため、正しいフォントを使用しているかどうかを確認するためにも使用できます。
-debug annotate」メソッドは、IM v6.3.9-2に追加されました。

古い手法

ただし、このデバッグ出力は便利ではない場合があり、このバージョンよりも古いIMを処理する必要がある場合があります。以下は、テキストがさまざまな方法と色で実際に描画され、その後、結果の画像から情報(整数)が抽出される古い例です。たとえば、「Ravie」フォントの寸法を、72ポイントの固定ベースラインに対して調べます。
参照として、調査する画像を以下に示します。データのみを抽出しており、画像を抽出していないため、画像として描画して保存する必要はありません。この画像の色は変更されるため、「-trim」を使用して、使用されるメトリクスを抽出するために、白と黒の部分を個別に調べることができます。

  magick -size 100x150 xc:lightblue -font Ravie -pointsize 72 \
          -fill black -undercolor white  -annotate +20+100 'A' font_drawn.gif
[IM Output]
基本的なフォントメトリクスについては、まず透明な色(「None」)でフォント自体を描画します。これにより、このフォントのこの特定の文字のバウンディングボックスまたは描画領域のサイズと場所を測定できます。高さ情報については、何でも描画できます。

  magick -size 100x150 xc:lightblue -font Ravie -pointsize 72 \
          -fill none -undercolor white  -annotate +20+100 'A' -trim  info:
[IM Text]
上記の結果から、72ポイントの「Ravie」フォントは、合計バウンディングボックスの高さが74ピクセルになります。ボックスの上部は、画像の上部から42ピクセル離れており、100ピクセルのy座標に配置されたベースラインとして、ボックスの開始位置は100 - 42、つまりベースラインの上58ピクセルです。つまり、ディセンダーのベースラインの下には74 - 58、つまり16ピクセルが残ります。
すべてのフォントが描画を定義された描画バウンディングボックス内に制限するとは限りません!ただし、一部の文字はそれらの境界をはるかに超えて拡張される場合があります。つまり、上記の例では「-fill」の色を「none」に設定している理由です。そうすることで、動作の悪いフォントは上記の測定値に影響を与えません。
また、行を分離する距離(実際にはベースライン)は、フォントのポイントサイズによってのみ決定され、フォントの描画方法とは関係ありません。私たちの例では、フォントのポイントサイズが72ポイントであり、ポイントは1インチの1/72と定義されているため、ベースラインは1インチ離れている必要があります。現在の出力解像度(密度)が1インチあたり72ピクセルであるため、ベースラインは72ピクセル離れます。興味深いことに、これは、74ピクセルのバウンディングボックスを持つこのフォントでは、適切にシングルスペースされたテキストの行間の描画領域に2ピクセルのオーバーラップがあることを意味します!また、上記の数値から、このフォントでこのポイントサイズで文字列「A」を描画する場合、次の文字は開始点(キャレットとして知られる)の右66ピクセルに描画する必要があることがわかります。これは文字列の「論理的」長さです。つまり、次の文字の「キャレット」または開始点は、20 + 66、つまり「+86+100」(ベースラインは垂直方向に変化しません)で開始する必要があります。一部のアラビア語フォントは実際には右から左に描画される可能性があるため、キャレットのオフセットは負になることに注意してください。これにより、「A」のフォントメトリクスが得られますが、「キャレット」または開始点に対する描画された「A」の物理的寸法はどうでしょうか。2つの色の設定を入れ替えるだけです…

  magick -size 100x150 xc:lightblue -font Ravie -pointsize 72 \
          -fill black -undercolor none  -annotate +20+100 'A'  -trim   info:
[IM Text]
高さに関しては、文字は定義された描画境界内にあり、高さが100 - 43、つまりベースラインの上57ピクセル(バウンディングボックスにぴったりとくっついている)から60 - 57、つまりフォントのベースラインの下わずか3ピクセルまで伸びています。言い換えれば、この文字にはベースラインの下に描画された「ディセンダー」がありません。これにより、「A」はキャレットの3ピクセル前(+20に配置されていますが、最終的な画像は+17にあります)から、70 - 3、つまりキャレットの位置の67ピクセル後に描画されることがわかります。言い換えれば、このフォントは描画時に水平バウンディングボックスよりもわずかに幅広いです。これにより、実際の描画文字列の長さがわかりますが、これはテキストを追加する際に必要なキャレットオフセットとは異なります(これは文字列のバウンディングボックスによって定義され、描画された長さではありません)。言い換えれば、テキストは実際の描画された長さのサイズではなく、バウンディングボックスを使用して追加する必要があります。もちろん、動作の悪いフォントを取得した場合は、特定の文字列が境界を超えてどの程度描画されるかを確認して、行の終わりなどにスペースを確保することができます。
フォントから抽出された寸法は、フォントを描画するために使用される現在の「-strokewidth」によっても異なります。アウトラインストロークのサイズを大きくすると、フォントを描画するために必要な寸法(およびバウンディングボックスのサイズ)も、同じ量だけ拡大されて、より太いアウトラインに対応します。
寸法はオペレーティングシステム(タイプとバージョン)と、そのシステムでIMが使用している委任フォント描画ライブラリのバージョンによっても異なります。正確に同じフォントライブラリとIMバージョンが変更されていない場合でも同様です。異なるコンピューターでテキスト描画を使用する可能性がある場合、結果は同じフォントでも異なる可能性があるため、注意が必要です。
詳細については、ドキュメントTrueType Fundamentals (PDF)を参照してください。これにより、上記の私の一般化が常に真実とは限らないことが示されていますが、一般的にはその通りです。上記の例では、ピクセル単位の整数値のみが返されますが、フォントで使用されるすべての寸法は浮動小数点数であることに注意してください。実際、フォントがピクセル単位の整数値(キャレット)の開始点から描画されるかどうかは、アプリケーションに依存し、フォントの最終的な外観に影響を与える可能性があります。

混合フォントスタイルの行の作成

複数のフォント、ポイントサイズ、スタイルを使用して1行を作成することは、IMの設計目的ではありません。テキストの左右揃え、単語の折り返し、画像やその他の要素への折り返しなどを考慮し始めると、さらに複雑になります。これは、ワードプロセッサ、ウェブブラウザ、ドキュメントプリンタなどのプログラムが、通常はユーザー操作下で非常に得意とすることであり、プログラム制御下でうまく実行できるものはほとんどありません。「TeX」とその関連プログラム(下記の完全なテキスト処理システムを参照)はその例外であり、テキストをグラフィカルに処理することに真剣に取り組むのであれば、このプログラム群を検討することをお勧めします。別の方法としては、HTMLコンバータなどの様々なドキュメント「整形」プログラムがあります。これらを使用して、プログラムで生成されたドキュメントをPostScriptに変換し、IMで目的の画像形式やスタイルに後処理することができます。IMのディスカッションフォーラムの「El Supremo」によって、C MagickWand APIインターフェースを使用したAPIソリューションがFontMetricsプログラムで作成されました。そして、こちらが「FontMetrics」の出力例です。
IMのコマンドラインは「ワードプロセッシング」向けに設計されていませんが、そのため使用できないという意味ではありません。単に、より困難になるだけです。ここでは、異なるフォントとスタイルでテキストを混合するいくつかの例を示し、出発点として提供します。通常、人々が考える最も簡単な解決策は、「label:」画像を連結することです…

  magick -font LokiCola     -pointsize 36  label:'LokiCola ' \
          -font Candice      -pointsize 24  label:'Candice ' \
          -font SheerBeauty  -pointsize 48  label:'SheerBeauty' \
          +append   wp_label_append.jpg
[IM Output]
しかし、ご覧のように、すべての画像は画像の上部に垂直方向に揃えられており、同様のフォントを使用しない限り、見栄えが良くありません。あるいは、追加の調整テクニックを使用して、下部に揃えることができます。

  magick -size 1x50 xc:none +size \
          \( -background white -font LokiCola -pointsize 36 \
             label:'LokiCola ' \
             -clone 0 +swap  -background none -append \) \
          \( -background white -font Candice  -pointsize 24 \
             label:'Candice ' \
             -clone 0 +swap  -background none -append \) \
          \( -background white -font SheerBeauty  -pointsize 48 \
             label:'SheerBeauty' \
             -clone 0 +swap  -background none -append \) \
          -delete 0   -gravity South -crop 0x50+0+0   +append \
          -bordercolor none  -border 1 -trim  +repage \
          -background white -flatten    wp_label_bottom.jpg
[IM Output]
これは、各ラベルの上部に余分なパディングを追加し、それらをすべて同じ高さにクロップしてから水平方向に連結することによって行われました。その後、単純な「-trim」と「-flatten」を使用して、行の高さを最も高いラベルに設定し、背景を塗りつぶしました。ご覧のように、これはより良い結果をもたらしますが、小さなフォントでは、適切に揃えられたテキストではなく、添字のような動作が生じる傾向があります。実際に行う必要があるのは、すべてのテキスト文字列を「ベースライン」で揃えることであり、より多くのテキスト情報へのアクセスがないと非常に困難です。この情報は、プログラムAPIでは容易に取得できますが、コマンドラインからははるかに困難です。1つの方法は、前のセクションの例で示されています。ただし、ベースライン情報を実際に収集することなく、ベースラインで単語を揃えることは可能です。「label:」テキスト画像は、画像のベースラインに関する手がかりを提供しませんが、特定のベースラインで画像を描画できます。APIがないと、描画されたテキストの長さや高さを直接知ることはできないため、最初に、テキスト画像に関する情報を失わないように十分な大きさのキャンバスを使用する必要があります。次に、末尾のスペースとテキストの高さを維持するために、「-undercolor」機能をテキスト注釈に使用し、画像トリミングの境界を提供する必要があります。では、コマンドラインからどのように実行できるかを見てみましょう。

  magick -size 500x100 xc:none  -fill blue  -draw 'line 15,0 15,99' \
          -undercolor white -fill black \
          \( -clone 0   -font LokiCola    -pointsize 36 \
             -annotate +5+60 'Loki Cola ' \) \
          \( -clone 0   -font Candice     -pointsize 24 \
             -annotate +5+60 'Candice ' \) \
          \( -clone 0   -font SheerBeauty -pointsize 48 \
             -annotate +5+60 'Sheer Beauty' \) \
          -delete 0 -trim +repage  +append \
          -transparent blue  -trim +repage \
          -background white -flatten   wp_draw_baseline.jpg
[IM Output]
以前と同様に、画像のトリミングは2つのステップで行われます。まず、垂直方向の青い線を含むベース画像にテキストを描画します。したがって、テキストをトリミングすると、テキスト画像の幅のみがトリミングされ、すべての単語が同じベースライン高さに保たれます。それらを連結した後、青い構成線を完全に透明にすることで削除できます。白黒画像のみを生成する場合は、非青色のチャネルの1つを抽出する方が良い方法です。これにより、構成線が確実にすべて取得されます。2回目のトリミングでは、上部と下部のセクションをトリミングして、最大の境界ボックスに縮小します。境界ボックスと同じ色への最終的なフラット化により、行の構築に使用されたすべての痕跡が削除されます。ご覧のように、すべてのテキストが、使用されるフォントやポイントサイズに関係なく、適切にベースラインに揃えられています。もちろん、これらの例では白黒のテキストのみを使用しました。構成線とテキスト配置に使用される透明な背景と干渉しない限り、他の色を使用できます。このテクニックを使用すると、混合フォントのテキスト行を生成し、それらを垂直方向に連結してより大きなドキュメントを作成できます。また、これらすべてを行うには多くの作業が必要であり、ワードプロセッサやウェブブラウザによって通常はユーザーから隠されている作業であることもわかります。このような作業をたくさん行う予定がある場合は、先に述べた代替手段を検討することをお勧めします。

フォームへの記入

標準的な記入フォームの画像があり、よく知られた位置にあるフィールドに記入したいとします。そのため、ここに示すような「text_data.txt」のようなデータファイルがあります…
[IM Text]
フィールドは、テキスト幅、重力(ジャスティフィケーション)、色、位置x、y、およびこのフィールドに配置する実際のテキストです。これで、上記の記述に従ってテキストラベルを生成する単純なループ化されたシェルスクリプトを使用して、フォーム(背景)画像の定義されたテキスト位置に適切なテキストを割り当てることができます。

  cat text_data.txt |
  while read width gravity color  pointsize x y text
  do
    magick -size ${width}x -gravity $gravity -fill $color -background wheat \
                -pointsize $pointsize  -page +${x}+${y}  label:"${text}"  miff:-
  done |
    magick -size 200x100 xc:   -   -flatten    text_layered.jpg
[IM Output]
この場合の「フォーム画像」は空白の画像ですが、実際には何でもかまいません。ラベルの背景色を「小麦色」に設定して、塗りつぶされた領域が見えるようにしましたが、通常は「なし」に設定します。上記は一時ファイルを使用しませんが、代わりにMIFF形式の画像のパイプラインを使用します。これは画像ストリーミング形式の使用例であり、個々の画像はファイルまたはパイプライン内で次々と単純に連結されます。これは出発点にすぎません。フォームフィールドは定義ファイルから取得でき、入力するテキストはデータベースまたはその他のデータソースから取得できます。使用するフォント、テキストの回転など、他の属性も設定できます。幅と高さの両方を含めることもできます。または、テキストを折り返す必要がある場合は、ラベルではなくキャプションを使用する必要があります。このテクニックの別の例として、上記と同様のマップのピンも参照してください。

テキスト処理の代替手段

完全にフォーマットされたテキストファイルとドキュメントを生成する理想的な方法は、より大規模な画像とテキスト処理システムの一部としてImageMagickを使用することです。
ツール …に使用
ImageMagick    画像の一括処理と準備
GIMP 単発の問題解決のためのGUI画像編集
 
LyX …を生成するために構築されたGUIワードプロセッシング
LaTeX ドキュメントや書籍のためのテキストプロセッサ…
TeX 基盤となるテキスト形式
(ページ上の位置、シンボル、フォント)
Metafont TeXフォントジェネレータ
基本的に、ImageMagickは多くのことができますが、そのためそれがそれらのすべてにとって最適なツールであるという意味ではありません。より大規模なドキュメントの準備では、それを全体の一部として扱う方が良いでしょう。上記の様々な「TeX」ツールは、ほとんどのLinuxシステムでは標準的なインストールであり、テキストと画像を統合された全体に組み合わせることができます。さらに重要なのは、テキストをテキストとして保持し、指定したとおりにテキストを適切にフォーマットし、ワードラップやページラップ、画像の配置に関するほとんどすべての難しい作業を行います。しかし、「doc」ファイルに役に立たないフォーマットのゴミを詰め込むことはありません。完全な制御が可能で、決定を任せることもできます。これにより、単純なページ、ニュースレター、さらには完全な書籍まで、あらゆる種類のドキュメントを生成できます。ドキュメントの生成を真剣に考えているのであれば、これらのツールは検討して学習する価値があります。
Pango(LinuxとMacOSXのみ)も代替手段を提供します。ImageMagickでは利用できない多くのテキストから画像への処理機能を提供します。たとえば、タブ、ジャスティフィケーション、マージン、ヘッダーなどです。テキストの中間でフォントを変更できるように、何らかのマークアップ言語も備えています。
他のソリューションには、上記のPostScript処理でPostScriptファイルの生成例を示した「a2ps」などの多くのテキストからPostScriptへの変換プログラムが含まれます。これは、ワードラップ、太字、タブ制御、そして妥当なヘッダー、フッター、境界線、複数ページオプションなどを備えた、多くの異なる種類のテキストファイルを変換およびフォーマットします。もちろん、これはPostScriptまたはPDFの中間言語を介した間接的な画像処理です。もう1つは、SVGまたはImageMagickの描画コマンドを使用してテキストをレイアウトすることですが、その場合はレイアウトに対処する必要があります。テキストを画像に変換するツールはたくさんあり、ほとんどはImageMagickと組み合わせてテキスト画像を後処理し、画像にマージできます。これにより、ImageMagickは画像処理という得意なことに集中できます。