9
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

RMagickで描画される文字列のサイズを取得する方法

Last updated at Posted at 2014-03-06

Magick::Draw::textメソッドで文字列を描画する場合、一定の幅で改行を入れたい場合などに描画される文字列のサイズを取得したい場合がある。このような用途にMagick::Draw::get_type_metricsが用意されている。このメソッドは文字列を渡すとDrawオブジェクトに設定されているフォントとフォントサイズで描画文字列サイズのサイズを返すことになっている、、、のだが、

以下のようなコードでは、最新(2014/3/7時点)のバージョン2.13.2では
デフォルトのフォント、フォントサイズのままサイズが取得されてしまう。

get_font_size_orig.rb
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}"

回避方法は以下。

get_font_size.rb
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= で指定する必要があった。
(ソースを見た感じ、新旧両方のメソッドが残っており、かつ古い方のみ動作している。。。?)

9
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?