shimada-kの日記

ソフトウェア・エンジニアのブログです

imlib2のdraw_textで遊んでみる

Rubyの画像処理ライブラリimlib2で画像に文字を埋め込んで遊んでみました。

環境

入力した文字列の文字数によって適切にフォントのサイズと縦横のマージンを計算し、さらに一行におさまる長さで改行を挟んで画像内に表示するコードを書いてみました。

Gist

フォントの大きさの単位はpt(ポイント)指定ですので、フォントサイズを決める時は画像の大きさとの兼ね合いでpx(ピクセル)からptへ変換する必要があります。

また、LinuxはDPIが96なのでpxで計算した値をフォントサイズとすると画像からはみ出してしまいます。

(imlibのコンパイルオプションで決まっているかX11の設定をAPI経由で引っ張ってきているかだと予想しています)

全角・半角が混在してる文字列を解析するのはアルゴリズムが複雑になるので、ASCII文字は全角化します。そのためgemでmojiをインストールしておきます。インストールの仕方はこちらを参照

今回は単色青色の240x240の画像に白い文字を書いてみました。

f:id:shimada-k:20140506030316p:plain

使用フォント:/usr/share/fonts/truetype/ttf-japanese-gothic.ttf

全角化してるためASCII文字はなんか間延びしてる印象。

f:id:shimada-k:20140506152752p:plain

文字数が多てもサイズとマージンが最適化されます。

f:id:shimada-k:20140506152807p:plain

フォントサイズはpt指定ですが、draw_textの引数で渡す座標はpx指定なので注意が必要です。

img.draw_text(font,
    str_entry,
    stringAndSize['offset_horizon'],
    stringAndSize['offset_vertical'] + pt2px((stringAndSize['margin_vertical'] + stringAndSize['size']) * index),
    color)

フォントのパスを追加すればwebからダウンロードしたフォントも使用できます。パスはttfファイルが直下に存在するディレクトリを指定すればOK

# フォントのパス追加
Imlib2::Font.add_path('/home/shimada-k/Development/fonts')
Imlib2::Font.add_path('/home/shimada-k/Development/fonts/mplus-TESTFLIGHT-058')

今回は以下のフォントを使ってみました。

自由の翼フォント(JiyunoTsubasa)

f:id:shimada-k:20140506151630p:plain

うつくし明朝体(UtsukushiMincho)

f:id:shimada-k:20140506151647p:plain

うずらフォント(uzura)

f:id:shimada-k:20140506151656p:plain

フロップデザインフォント(FLOPDesignFont)

f:id:shimada-k:20140506151709p:plain

M+ FONTS(mplus-TESTFLIGHT)

f:id:shimada-k:20140506151717p:plain

ロゴたいぷゴシック(07LogoTypeGothic7)

f:id:shimada-k:20140506151725p:plain

ロゴたいぷゴシックが一番おさまりがいい。