1.在windows上安装Rmagic,如果你是通过gem安装的,require ’Rmagic’ 要修改为: require ’rubygems’require ’Rmagick’ 才能正确引入。2.网上那个例子,画布是使用Rmagic内置的图像格式,Rmagic内置的图像格式还有:gradient*梯度,比如gradient:red-bluegranite花岗石,比如: "granite:".logologo型的图像. 如: "logo:",后面会多显示一个五角星^_^netscape非常漂亮的彩条。如: "netscape:"null*空白 使用方式: "null:" rose 玫瑰 使用方式 : "rose:"xc*设置一个背景色,比如”xc:green” 一个修改的例子,在rails的models下存为noisy_image.rb,在Controller就可以这样调用NoisyImage.new(4) : ruby 代码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 3.与rails应用的结合,和一般的验证码原理一样,将产生的随机数存储在session或者request范围内,提交的时候进行比较验证即可。比如产生图片的时候将随机字母存储在session[:code]中: def register session[:noisy_image] = NoisyImage.new(4) #生成一个有4字符的图片 session[:code] = session[:noisy_image].code end验证的时候,比较提交的type_code与session[:code]即可,为了安全性考虑,最好还是不考虑使用客户端验证。 def code_check if params[:code]!=session[:noisy_image].code render_text " 验证码错误!" else render_text "" end endcontroller.rb具体代码如下:java 代码class UserController < ApplicationController model:noisy_image def code_check if params[:code]!=session[:noisy_image].code render_text " 验证码错误!" else render_text "" end end def register session[:noisy_image] = NoisyImage.new(5) #生成一个有5字符的图片 session[:code] = session[:noisy_image].code end def code_image image = session[:noisy_image].code_image send_data image, :type => 'image/jpeg', :disposition => 'inline' end end 在页面显示图片,类似servlet一样直接调用Controller的action: 在register.rhtml中加入以下代码:ruby 代码ruby 代码<img height="30" src= "/user/code_image">