この記事について
RMagickを使って傾いた文字を描画しようとしたときに軽くハマったので忘れぬようにメモ
傾いた文字の描画方法
文字を描画するにはDrawクラスのtext
かannotate
を使うが、それに傾きを入れるとそれぞれ傾かせるために使うメソッド、プロパティが異なるので両方解説
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
プロパティなので間違えやすい - 最新のドキュメントに詳しい記載が無い
- http://www.rubydoc.info/gems/rmagick/Magick/Draw#annotate-instance_method
- ↑に
- Additional Draw attribute methods may be called in the optional block, which is executed in the context of an Draw object.
とあるが "Additional Draw attribute" がどれのことなのか詳しく書いてない
- 昔のドキュメントには記載あるけど
-