LoginSignup
1
2

More than 5 years have passed since last update.

RMagickで文字を傾いた文字を描画する方法

Posted at

この記事について

RMagickを使って傾いた文字を描画しようとしたときに軽くハマったので忘れぬようにメモ

傾いた文字の描画方法

文字を描画するにはDrawクラスのtextannotateを使うが、それに傾きを入れるとそれぞれ傾かせるために使うメソッド、プロパティが異なるので両方解説

text メソッドを使う場合

https://rmagick.github.io/rotate.rb.html のコードを拝借して必要箇所のみ抜粋

ポイント

  • 座標系を回転させて描画時の文字を回転させる
  • RMagick::Draw#rotate メソッドで回転させる
rotate_text.rb
require 'RMagick'

imgl = Magick::ImageList.new
# 200x200 で画像を準備しつつ、わかりやすいように薄い色でグリッドを描画しとく
imgl.new_image(200, 200, Magick::HatchFill.new('white','lightcyan2'))

gc = Magick::Draw.new

# 座標系の原点を左上から中央に移動
gc.translate(100, 100)

# 45度回転(時計回り方向に)
gc.rotate(45)

# 文字を描画
gc.fill('black') # 見やすいように黒で

gc.text(0, 0, "Hello")
gc.text(100, 0, "100,0")
gc.text(-100, 0, "-100,0")

gc.draw(imgl)

imgl.write("png32:rotate.png") # ファイルに書き出し

annotate メソッドを使う場合

  • RMagick::Draw#annotate メソッドのブロック内のプロパティ rotation で回転させる
rotate_annotate.rb
require 'RMagick'

imgl = Magick::ImageList.new
# 200x200 で画像を準備しつつ、わかりやすいように薄い色でグリッドを描画しとく
imgl.new_image(200, 200, Magick::HatchFill.new('white','lightcyan2'))

gc = Magick::Draw.new

# 座標系の原点を左上から中央に移動(annotateメソッドはtranslateの影響を受けないので↓は実は無意味)
gc.translate(100, 100)

# 45度回転(時計回り方向に)(このrotateも無意味)
gc.rotate(45)

# 文字を描画
# translateで移動した座標系の影響を受けないので中心の位置に描画できるように100,100を指定
gc.annotate(imgl,0,0,100,100,'Hello') do
  self.fill = 'black' # 見やすいように黒で
  self.rotation = '45'
end
# 元の座標系の100,0の位置に描画される
gc.annotate(imgl,0,0,100,0,'100,0') do
  self.fill = 'black' # 見やすいように黒で
  self.rotation = '45'
end
# 元の座標系の-100,0の位置に描画されるが、画像の外なので見えない
gc.annotate(imgl,0,0,-100,0,'-100,0') do
  self.fill = 'black' # 見やすいように黒で
  self.rotation = '45'
end

gc.draw(imgl)

imgl.write("png32:rotate.png") # ファイルに書き出し

はまりポイント

  • もともと文字描画に annotate を使い慣れていると
    • rotate メソッドが効かないので何で?って思う
    • 座標系を移動したり回転しても annotate に影響が出ない
    • annotate のブロック内は rotate メソッドではなく rotation プロパティなので間違えやすい
    • 最新のドキュメントに詳しい記載が無い
    • 昔のドキュメントには記載あるけど
1
2
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
1
2