RailsとRMagickを使って画像にテキストを加工するアプリケーションを作っています。
publicに置いたtest2.pngという画像にコントローラからrmagick.rbを実行するものを作りました。song.rb, translation.rb, lyric.rbというモデルから取得したデータをSongsControllerというコントローラからpublic配下のrmagickに、変数を渡したいです。
グローバル変数を作って見たのですが、rmagickでうまく取得できません。
どうすればpublic/rmagick.rbで、モデルのデータをSongsControllerを介して取得できるでしょうか。
現状、直で書いた文字列だとうまく動くところまでは確認してます。
public/rmagick.rb
ruby
1require 'fileutils' 2require 'RMagick' 3 4# メッセージ 5MSG_USAGE = "USAGE: ruby rmagick.rb filename" 6MSG_NOT_EXIST = "File not exist!" 7 8class Arg 9 # 引数取得 10 def get_arg 11 begin 12 if ARGV[0] 13 # ファイルが存在しなければ終了 14 unless File.exist?(ARGV[0]) 15 puts MSG_NOT_EXIST + " #{ARGV[0]}" 16 exit 17 end 18 else 19 # 引数無ければ終了 20 puts MSG_USAGE 21 exit 22 end 23 24 # ファイル名返却 25 return ARGV[0] 26 rescue => e 27 STDERR.puts "[ERROR][#{self.class.name}.get_arg] #{e}" 28 exit 1 29 end 30 end 31end 32 33class Rmagick 34 35 def initialize(filename) 36 @img_file = filename 37 end 38 39 # テキスト描画 40 def rmagick(columns = 5) 41 FileUtils.cp(@img_file, "2"+@img_file, {:preserve => true}) # 元画像退避 42 img = Magick::ImageList.new(@img_file) # 画像オブジェクト 43 draw = Magick::Draw.new # 描画オブジェクト 44 45 46 #ここで変数を受け取りたい!!!! 47 str = $translation_img 48 str2 = $lyric_img 49 str3 = $title_img 50 51 begin 52#ここに変数を代入したい!!!!!! 53 draw.annotate(img, 0, 0, 70, 320, str3.scan(/.{1,#{30}}/).join("\n")) do 54 55 self.fill = 'white' 56 self.stroke = 'transparent' 57 self.pointsize = 24 58 self.gravity = Magick::NorthWestGravity 59 end 60 61 draw.annotate(img, 0, 0, 70, 165, str2.scan(/.{0,44}[a-z.!?,;](?:\b|$)/mi).join("\n") ) do 62 self.fill = 'white' 63 self.stroke = 'transparent' 64 self.pointsize = 44 65 self.gravity = Magick::NorthWestGravity 66 end 67 68 draw.annotate(img, 0, 0, 68, 55, str) do 69 70 self.fill = 'white' 71 self.stroke = 'transparent' 72 self.pointsize = 24 73 self.gravity = Magick::NorthWestGravity 74 end 75 76 # 画像生成 77 img.write("2"+@img_file) 78 rescue => e 79 STDERR.puts "[ERROR][#{self.class.name}.rmagick] #{e}" 80 exit 1 81 end 82 end 83end 84 85# 引数取得 86obj_arg = Arg.new 87filename = obj_arg.get_arg 88 89# Copyright 描画 90obj_main = Rmagick.new(filename) 91obj_main.rmagick
SongsController.rb
ruby
1 2 def share 3 4 @translation= Translation.find_by(id: params[:id]) 5 @lyric = Lyric.find_by(number: @translation.number , song_id:@translation.song_id) 6 @song = Song.find_by(id: @translation.song_id) 7 #インスタンス変数をモデルから取得 8 9 #これをグローバル変数にしてrmagick.rbに渡したい 10 $translation_img = @translation.content 11 $lyric_img = @lyric.content 12 $artist_img = @song.artist 13 $title_img = @song.title 14 15 if @current_user 16 @user = User.find_by(id: @current_user.id) 17 end 18 #public/rmagickに引数を与えて実行 19 system("cd ~/lyrica/public/tweet_img && pwd && ruby rmagick.rb test2.png") 20 end
追記
### lib / rmagick.rb
ruby
1require 'fileutils' 2require 'RMagick' 3 4 5class Arg 6 # 引数取得 7 def get_arg 8 begin 9 if ARGV[0] 10 # ファイルが存在しなければ終了 11 unless File.exist?(ARGV[0]) 12 puts MSG_NOT_EXIST + " #{ARGV[0]}" 13 exit 14 end 15 else 16 # 引数無ければ終了 17 puts MSG_USAGE 18 exit 19 end 20 21 # ファイル名返却 22 return ARGV[0] 23 rescue => e 24 STDERR.puts "[ERROR][#{self.class.name}.get_arg] #{e}" 25 exit 1 26 end 27 end 28end 29 30class Rmagick 31 attr_reader :translation, :lyric, :title, :artist 32 33 def initialize(filename, translation_img:, lyric_img:, title_img:, artist_img:) 34 @filename = filename 35 @translation = translation_img 36 @lyric = lyric_img 37 @title = title_img 38 @artist = artist_img 39 end 40 41 # テキスト描画 42 def rmagick(columns = 5) 43 44 FileUtils.cp(@filename, "2"+@filename, {:preserve => true}) # 元画像退避 45 img = Magick::ImageList.new(@filename) # 画像オブジェクト 46 draw = Magick::Draw.new # 描画オブジェクト 47 begin 48 draw.annotate(img, 0, 0, 70, 320, @lyric.scan(/.{1,#{30}}/).join("\n")) do 49 50 self.fill = 'white' 51 self.stroke = 'transparent' 52 self.pointsize = 24 53 self.gravity = Magick::NorthWestGravity 54 end 55 56 draw.annotate(img, 0, 0, 70, 165, @tranalation.scan(/.{0,44}[a-z.!?,;](?:\b|$)/mi).join("\n") ) do 57 58 self.fill = 'white' 59 self.stroke = 'transparent' 60 self.pointsize = 44 61 self.gravity = Magick::NorthWestGravity 62 end 63 64 draw.annotate(img, 0, 0, 68, 55, @title) do 65 66 self.fill = 'white' 67 self.stroke = 'transparent' 68 self.pointsize = 24 69 self.gravity = Magick::NorthWestGravity 70 end 71 72 # 画像生成 73 img.write("2"+@filename) 74 rescue => e 75 STDERR.puts "[ERROR][#{self.class.name}.rmagick] #{e}" 76 exit 1 77 end 78 end 79end 80
### SongsController.rb
ruby
1def share 2 3 @translation= Translation.find_by(id: params[:id]) 4 @lyric = Lyric.find_by(number: @translation.number , song_id:@translation.song_id) 5 @song = Song.find_by(id: @translation.song_id) 6 7 if @current_user 8 @user = User.find_by(id: @current_user.id) 9 end 10 11 images = { 12 translation_img: @translation.content, 13 lyric_img: @lyric.content, 14 artist_img: @song.artist, 15 title_img: @song.title 16 } 17 filename = Rails.root.join('public', 'test2.png') 18 ::Rmagick.new(filename.to_s, **images).rmagick if filename.exist? 19 end
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/03 06:05
2018/06/03 06:25 編集
2018/06/03 07:42