- SanyKing
- 等级: 初级会员

- 性别:

- 文章: 8
- 积分: 0
- 来自: 宁波

|
在windows环境下,旧版本的Rmagick安装完gem后,需要运行一个postinstall.rb来设置windows字体等。新版本的Rmagick没有这个步骤,代替是安装ImageMagick。我按照README安装成功后,在rails中使用还是出现无法读取字体的错误,忍无可忍又换了旧版本的Rmagick,没想到跟ruby的解释器版本不一致,render templage的时候出现parse error类型的错误。认真比对了下新老版本的差别,原来旧版本的Rmagick在Config目录下多了个type-windows.xml来设置windows字体,在此记录下正确的安装方法:
1.到http://rubyforge.org/frs/?group_id=12&release_id=8170,下载RMagick-1.14.1_IM-6.3.0-7-Q8.zip
2.解压后在目录执行gem install rmagick-1.14.1-win32.gem
3.最后,双击ImageMagick-6.3.0-7-Q8-windows-dll.exe安装ImageMagick
4.将ImageMagick的安装目录加进环境变量path,如果有的话就不用了
5.最后一步,将附件中的type-windows.xml拷贝进ImageMagick安装目录下的config目录,比如E:\ImageMagick-6.3.0-Q8\config,修改type.xml,原来是:
代码
<typemap>
<include file="type-ghostscript.xml" />
</typemap>
修改为:
代码
<typemap>
<include file="type-windows.xml" />
<!-- <include file="type-ghostscript.xml" /> -->
</typemap>
1.在windows上安装Rmagic,如果你是通过gem安装的,
require ’Rmagic’
要修改为:
require ’rubygems’
require ’Rmagick’
才能正确引入。
2.网上那个例子,画布是使用Rmagic内置的图像格式,Rmagic内置的图像格式还有:
gradient*
梯度,比如gradient:red-blue
granite
花岗石,比如: "granite:".
logo
logo型的图像. 如: "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:
- 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
end
controller.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 代码
声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
| 返回顶楼 |
|
|
- stworthy
- 等级:


- 文章: 121
- 积分: 164

|
有没有不要Rmagic的验证码解决方法?
|
| 返回顶楼 |
|
|
- dennis_zane
- 等级:


- 性别:

- 文章: 758
- 积分: 1048
- 来自: 广州

|
无语,这不是我写的吗?拜托,你也声明下转载的 http://www.blogjava.net/killme2008/archive/2007/04/09/109456.html
|
| 返回顶楼 |
|
|