RMagickで描いた絵をrailsで表示するサンプル


こんな単純なのを描きます.

前提:
基本的にImageMagickとRMagickだけ入れれば良いのだけど,
とりあえず,色々入れておきます.
mac portsrubygems が利用できるようになっている必要が在ります.

% sudo port install jpeg
% sudo port install libpng
% sudo port install libwmf
% sudo port install tiff
% sudo port install lcms
% sudo port install freetype
% sudo port install ImageMagick
% sudo port install ghostscript

% sudo gem install rmagick

次に,Railsの方で線を描いてみます.

例えば,controller が graph_controller.rb , viewが,graph/index.rhtml とすると
viewに

<img src="<%= url_for :action=>'your_img', :x1=>10, :y1=>10, :x2=>150, :y2=>180 %>" />

という1行を入れます.ここでGraphControllerのyour_imgメソッドが呼ばれます.
GraphController クラス内に,次のメソッドを作成します.

def your_img
width=200
height=200

canvas = YourImageView.new(width, height)
canvas.draw_line(params[:x1], params[:y1], params[:x2], params[:y2])
send_data(canvas.to_blob, :type=> 'image/png')
end

あと $rails_root(appとかconfigとかあるディレクトリ)/lib/your_image_view.rb として,次の内容のファイルを書きます.
これで,http://localhost/graph にアクセスすると,線が1本描かれたものが出て来ます.
線の始点と終点は,index.rhtmlのimgタグの引数(x1, y1, x2, y2)になっています.
lib/ 下のクラスは,railsが勝手に読み込んでくれます.
線を引く系統の命令(楕円とか,多角形とか)の使い方,
http://www.simplesystems.org/RMagick/doc/rvgshape.html
などに書かれています.

require 'RMagick'

class YourImageView
 include Magick
 include Reloadable
 attr_reader :canvas

 def initialize(width, height)
   @width= width
   @height = height
   @fg_color = 'black'
   @bg_color = 'white'
   @canvas = Magick::Image.new(@width, @height)
 end

 def draw_line x1, y1, x2, y2
   line = Magick::Draw.new
   line.fill @fg_color
   line.stroke @fg_color
   line.stroke_width 2
   line.line(x1.to_i, y1.to_i, x2.to_i, y2.to_i)
   line.draw @canvas
 end

 def to_blob(fileformat='PNG')
   return @canvas.to_blob do
     self.format = fileformat
   end
 end

end