Magick::Draw::textメソッドで文字列を描画する場合、一定の幅で改行を入れたい場合などに描画される文字列のサイズを取得したい場合がある。このような用途にMagick::Draw::get_type_metricsが用意されている。このメソッドは文字列を渡すとDrawオブジェクトに設定されているフォントとフォントサイズで描画文字列サイズのサイズを返すことになっている、、、のだが、
以下のようなコードでは、最新(2014/3/7時点)のバージョン2.13.2では
デフォルトのフォント、フォントサイズのままサイズが取得されてしまう。
require 'RMagick'
FONT_PATH = '/Library/Fonts/ヒラギノ角ゴ Pro W3.otf'
FONT_SIZE = 25
text = Magick::Draw.new
text.font(FONT_PATH)
text.pointsize(FONT_SIZE)
metrics = text.get_type_metrics('ほげほげ')
puts "width: #{metrics.width}, height: #{metrics.height}"
回避方法は以下。
require 'RMagick'
FONT_PATH = '/Library/Fonts/ヒラギノ角ゴ Pro W3.otf'
FONT_SIZE = 25
text = Magick::Draw.new
# font, point サイズはfont=, pointsize=で指定しないと get_type_metrics が正常動作せず、
# デフォルトのフォント、フォントサイズが適用されてしまう。
text.font = FONT_PATH
text.pointsize = FONT_SIZE
metrics = text.get_type_metrics('ほげほげ')
puts "width: #{metrics.width}, height: #{metrics.height}"
ややこしいのは実際 Draw::text で描画されるフォントとサイズは Draw::font(string), Draw::pointsize(integer) で指定しても反映されるが、get_type_metrics が誤った値を返す点。また、リファレンスでもこちらのメソッドのみ定義されている。
Draw::text, Draw::get_type_metrics 両方を正しく動作させるには Draw::font=, Draw::pointsize= で指定する必要があった。
(ソースを見た感じ、新旧両方のメソッドが残っており、かつ古い方のみ動作している。。。?)