主要参考了http://dennis-zane.iteye.com/blog/69400
1 安装RMagick
下载RMagick-1.14.1_IM-6.3.0-7-Q8 for win32的版本
安装ImageMagick-6.3.0-7-Q8-windows-dll.exe,为了采用这里的字体
然后安装gem包
gem install ImageMagick-6.3.0-7-Q8-windows-dll.exe
修改字体配制文件
ImageMagick-6.3.0-7-Q8-windows-dll.exe的安装目录下,有个config文件目录,修改type-ghostscript.xml文件
或者将附件里面的字体配制文件type-windows.xml拷贝到config目录,然后修改type.xml文件,来加入type-windows.xml文件
现在可以开始使用RMagick库来生成图片了. 下面是一个验证码实例
先建立一个工程code
在app/model下,建立noisy_image.rb用来具体生成图片的一个模型
require 'rubygems'
require 'Rmagick'
class NoisyImage
include Magick
attr_reader :code, :code_image
Jiggle = 15
Wobble = 15
def initialize(len)
chars = ('a'..'z').to_a - ['a','e','i','o','u']
code_array=[]
1.upto(len) {code_array << chars[rand(chars.length)]}
granite = Magick::ImageList.new('xc:#EDF7E7')
canvas = Magick::ImageList.new
canvas.new_image(32*len, 50, Magick::TextureFill.new(granite))
text = Magick::Draw.new
text.font_family = 'times'
text.pointsize = 40
cur = 10
code_array.each{|c|
rand(10) > 5 ? rot=rand(Wobble):rot= -rand(Wobble)
rand(10) > 5 ? weight = NormalWeight : weight = BoldWeight
text.annotate(canvas,0,0,cur,30+rand(Jiggle),c){
self.rotation=rot
self.font_weight = weight
self.fill = 'green'
}
cur += 30
}
@code = code_array.to_s
@code_image = canvas.to_blob{
self.format="JPG"
}
end
end
因为这个模型,没有和任何数据表有关系,所以不是Active:Record::Base的子类
要想rails可以知道有这个类,并且其他action可以调用这个类,需要在application.rb加入
model:noisy_image
在创建一个控制器code
在code_controller.rb加入
def index
session[:noisy_image] = NoisyImage.new(4) #生成一个有4字符的图片
session[:code] = session[:noisy_image].code
end
在view/code下,建立index.rhtml
登陆
<%=form_tag '/code/login'%>
<table>
<tr>
<td>输入验证码</td><td><%=text_field_tag:code%></td>
</tr>
<tr><td><img height='30' src="/code/code_image"></td></tr>
<tr><td><%=submit_tag '提交'%></td></tr>
</table>
<%=end_form_tag%>
通过login action来验证,通过code_image来发送图片给浏览器
下面实现code_controller.rb里面的login和code_image action
def code_image
image = session[:noisy_image].code_image
send_data image, :type => 'image/jpeg', :disposition => 'inline'
end
def login
if params[:code]==session[:noisy_image].code
@text="正确"
else
@text="不正确"
end
render:text=>@text
end