わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

convertコマンドで文字列を中心に配置

ImageMagickのconvertコマンドで,フォント他の設定をしたあと,「label:」に続けて文字列を指定すれば,その文字列を中央に置いた画像が生成できます.
なのですが,日本語文字列を使うと,中央になってくれません.例えばCygwin環境で,次のコマンドを実行してみます.

convert -background lightblue -fill blue \
  -font Meiryo-UI-Regular -pointsize 48 label:和歌山 \
  label.png

すると,作られる画像は以下のとおりで,下の余白が,上の余白よりも大きくなっています.

言語やフォントの種類を問わず,convertコマンドで配置できる文字列について,画像中の任意の座標*1を中心として表示できるよう,座標を計算してくれるRubyスクリプトを書きました.ソースはGistよりご覧ください.
このプログラムは座標計算のあと,テスト表示として2つの画像を生成します.一つは,白地に黒で文字列を置描画し,文字列の長方形領域とその対角線を線で引いています.上下左右の端と中央を確認できるようにしました.

もう一つの画像では,400x400の中心に文字列を置いています.

日本語と英語が混在でも,フォントが対応していれば,問題ありません.


ruby im-text-region.rbとして実行する場合,そのあとに引数を5つとることができ,順に,表示したい文字列,(convertの-fontオプションで指定できる)フォント名,フォントサイズ,出力ファイルのbasename,そして表示位置です.表示位置はデフォルトでは中心(center)ですが,左上(northwest)や右下(southeast)などを設定することも可能です.
座標計算に際して2つのconvertコマンドを実行しています.一つは,フォント名やフォントサイズ,表示したい文字列に基づく,グリフメトリクスの取得です.次に,文字列を置いたXPM画像を作成します*2.XPMファイルの中身はCのソースファイルですので,開いて行単位で読み出し,上下左右の端を算出しています.
このスクリプトを,ここのところ開発を進めていなかった三角パズルsolverに組み込む予定です.実行時に指定した任意のフォントで,1桁でも2桁でも,円の中できれいに数を表示することができるはずです.

(最終更新:2014-08-26 晩)

*1:labelオプションは,文字列のみを描画するのにはいいのですが,線分や円など,さまざまな画素を置いてから文字列を描画しようとすると,どうにも厄介なので,「the low level "-draw" operator」を活用しています.

*2:冒頭のリンク先に書かれている,「convert -debug annotate xc: -font Candice -pointsize 24 -annotate 0 'Test' null: | grep Metrics:」のコマンドで取得できるwidthとheightについて,フォントや文字列を変えていろいろ試したところ,もう少しだけ右と下にも,文字列の画素が来ることが分かったので,値を加えています.