第一步:安装必须的软件
在linux下生成图片需要图片处理软件ImageMagick的Ruby语言RMagick库支持。安装RMagick最麻烦,我查了N多资料试了N次才安装成功。
1. 安装ImageMagick:sudo apt-get install imagemagick
2. 查看安装结果:dpkg -l | grep magick
3. 更新软件包列表:sudo apt-get update
4. 安装图片处理软件包libmagick9-dev:sudo apt-get install libmagick9-dev ruby1.8-dev
5. 安装接口软件包RMagick:sudo gem install rmagick
6. 说明:如果出现问题或者错误请执行下面命令:sudo apt-get remove --purge libmagick9-dev
在irb里require 'RMagick'。如果返回true,表示安装成功。
第二步:编码
在models目录创建一个proof_image.rb
require 'rubygems'
require 'RMagick'
class ProofImage
include Magick
attr_reader :text, :image
Jiggle = 15
Wobble = 15
def initialize(len=4)
chars = ('a'..'z').to_a # + ('0'..'9').to_a
text_array=[]
1.upto(len) {text_array << chars[rand(chars.length)]}
#background_type = "granite:" #花岗岩
#background_type = "netscape:" #彩条
#background_type = "xc:#EDF7E7" #指定背景色,例:xc:red
#background_type = "null:" #纯黑
granite = Magick::ImageList.new('null:')
canvas = Magick::ImageList.new
canvas.new_image(32*len, 50, Magick::TextureFill.new(granite))
gc = Magick::Draw.new
gc.font_family = 'times'
gc.pointsize = 40
cur = 10
text_array.each{|c|
rand(10) > 5 ? rot=rand(Wobble):rot= -rand(Wobble)
rand(10) > 5 ? weight = NormalWeight : weight = BoldWeight
gc.annotate(canvas,0,0,cur,30+rand(Jiggle),c){
self.rotation=rot
self.font_weight = weight
self.fill = 'green'
}
cur += 30
}
@text = text_array.to_s
@image = canvas.to_blob{
self.format="GIF"
}
#生成图片文件
#text.text(0, 0, " ")
#text.draw(canvas)
#canvas.write('test.gif') #图片位于项目根目录下。也可以使用linux中的绝对路径如:/home/chengang/test.gif
end
end
在一个controller里加入一个方法,方法的作用是向网页提供图片数据。我选择创建一个专门的UtilController。
class UtilController < ApplicationController
def proof_image
proof_image = ProofImage.new
session[:proof_text] = proof_image.text
send_data proof_image.image, :type => 'image/jpeg', :disposition => 'inline'
end
end
以下是在页面中的调用代码:
输入验证码:<%=text_field(:proof, :text, :maxlength=>4) %>
<img id="img" src="/chen/util/proof_image">
<a href="#" onclick="changeImage();return false;">换一个验证码</a><br/>
其中changeImage()是一个javascript函数,因为换图片时必须改变<img的src,否则浏览器不会执行UtilController的proof_image方法,而是从缓存中取得图片数据。
function changeImage(){
$("img").src = "/chen/util/proof_image?tmp=" +new Date().getTime(); // Math.random();
}
我的环境:ubuntu 7.04 + Rails 1.2.3 +Ruby 1.8.5