前提・実現したいこと
Rubyのmini_magick gemを使って2種類の文字列を特定の画像の上から描画したい。
試したこと
下記のリンクのページを参考に文字列を画像に描画することは出来たのですが、フォントサイズやフォントが異なる文字列をもう一つ追加で描画する方法が思いつきません。(フォントサイズがタイトル40px、中身20pxのように2種類表示を画像内に描画したい)
自分なりに考えた方法としては
一度、1つ目の文字列を画像に描画し保存
その保存した画像をもう一度読み込んで、更にもう2つ目の文字列を描画し保存
という手順は思いついたのですが
- 似たようなコード群を2回も書くのもスマートではない
- 2度も保存と読み込みを繰り返したくない
これらの理由から、コード群が一箇所で完結するようなもっとスマートな方法を探しています。
helper
1module InvitesHelper 2 3 class InvitesHelper 4 require 'mini_magick' 5 require 'securerandom' 6 7 BASE_IMAGE_PATH = './app/assets/images/i.png'.freeze 8 GRAVITY = 'center'.freeze 9 TEXT_POSITION = '0,0'.freeze 10 FONT = './app/assets/fonts/genjyuubold.ttf'.freeze 11 FONT_SIZE = 65 12 INDENTION_COUNT = 11 13 ROW_LIMIT = 8 14 15 class << self 16 # 合成後のFileClassを生成 17 def build(text) 18 text = prepare_text(text) 19 @image = MiniMagick::Image.open(BASE_IMAGE_PATH) 20 configuration(text) 21 end 22 23 # 合成後のFileの書き出し 24 def write(text) 25 build(text) 26 @image.write uniq_file_name 27 end 28 29 private 30 31 # uniqなファイル名を返却 32 def uniq_file_name 33 "#{SecureRandom.hex}.png" 34 end 35 36 # 設定関連の値を代入 37 def configuration(text) 38 @image.combine_options do |config| 39 config.font FONT 40 config.gravity GRAVITY 41 config.pointsize FONT_SIZE 42 config.draw "text #{TEXT_POSITION} '#{text}'" 43 end 44 end 45 46 # 背景にいい感じに収まるように文字を調整して返却 47 def prepare_text(text) 48 text.scan(/.{1,#{INDENTION_COUNT}}/)[0...ROW_LIMIT].join("\n") 49 end 50 end 51 end 52end 53
controller
1 2include InvitesHelper 3 4 def create 5 @invite = Invite.new(invite_params) 6 if @invite.save 7 InvitesHelper.build(@invite.content).tempfile.open.read 8 InvitesHelper.write(@invite.content) 9 redirect_to user_invite_path(id: @invite.id) 10 else 11 render "new" 12 end 13 end
Inviteモデルのオブジェクトが保存されると、中身の文字列contentが画像内に描画されるようになっています。今回はこれに加えてフォントサイズが異なる文字列titleも描画したいと思っています。
ここに書いたコード自体はリンク先のものと殆ど一緒です。
お手数ですが、ここのコードが読みづらくコードの詳細を確認したい場合はリンク先をご覧ください。
回答いただけたら幸いです。よろしくお願いします。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。