论坛首页 编程语言技术论坛

用RMagick做验证码图形,文字显示不出来

浏览 4731 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-10-08  
用RMagick做了一个显示验证吗的图
在windows下显示一切正常,上传到linux服务器上后,图片显示出来了,有背景颜色,可是就是没有文字
请指点迷津,不胜感激。

引用
问题已经解决,后面说面了解决方法


class NoisyImage
  require 'RMagick'
  include Magick

  attr_reader :code, :code_image

  def initialize(length = 4)
    text_size = 33
    rand_height = 9
    colors = ['#FF0000', '#3300CC', '#FF3300', '#b50000', '#373000', '#f000f0', '##336600']
    validbglinecolors = ['#ABEFAB', '#FF99FF', '#CCCCFF', '#66FF66', '#CCFF33']
    validchars = (0..9).to_a
    dist = (5..30).to_a
    step = 8
    chars = []
    text_size_space = text_size * 0.8
    text_size_step = text_size * 0.6
    length.times {|x|
        chars << validchars[rand(validchars.size).ceil - 1].to_s
    }
    bglinecolor = validbglinecolors[rand(validbglinecolors.size).ceil - 1]
    image = Image.new(length * text_size_step + 10, text_size * 1.2, HatchFill.new('white', bglinecolor, dist[rand(dist.size - 1)]))
    text = Draw.new
    #使用字体文件和直接使用字体,或者不写font, font_family两个属性都是如图所示结果,linux下无字显示
    text.font = "fonts/" + ['times.ttf', 'arial.ttf', 'verdana.ttf', 'artro.ttf'].sort{rand}.pop 
    #text.font_family = ['times', 'sans', 'fixed', 'Verdana'].sort{rand}.pop
    text.font_weight = BoldWeight
    text.text(0, 0, ' ')

    chars.each {|char|
        text.annotate(image, 0, 0, step, text_size_space + rand(rand_height), char) {
            self.rotation = dist[rand(dist.size - 1).ceil]
            self.fill = colors[rand(colors.size - 1).ceil]
            self.pointsize = text_size - validchars[rand(rand_height).ceil]
        }
        step += text_size_step - rand(5)
    }
    text.draw(image)

    @code = chars.to_s()
    @code_image = image.to_blob{ self.format="JPG" }
  end
end



引用

原因是linux服务器下用的是fastcgi+apache,windows下测试用的是ruby webrick,而字体文件使用了相对路径,两者的路径是不同的,使用绝对路径就没有这个错误了
误:   text.font = "fonts/" + ['times.ttf', 'arial.ttf', 'verdana.ttf', 'artro.ttf'].sort{rand}.pop
正:   text.font = "/home/web/fonts/" + ['times.ttf', 'arial.ttf', 'verdana.ttf', 'artro.ttf'].sort{rand}.pop
  • 描述: 显示出来的图形,linux下是没有文字的。 windows下是正确的。
  • 大小: 9.6 KB
   发表时间:2007-10-08  
应该还是字体问题造成的,我用Magick.fonts查询了下linux上的字体,发现一个也没有。
windows下有字体。

现在把字体放置到了fonts目录下 fonts和app public等同级目录
windows似乎认这个目录下的字体文件(试过一些特殊字体)
但linux还是出不来……

line 24-25修改为:
text.font = "fonts/" + ['times.ttf', 'arial.ttf', 'verdana.ttf', 'artro.ttf'].sort{rand}.pop   
#text.font_family = ['times', 'sans', 'fixed', 'Verdana'].sort{rand}.pop 
0 请登录后投票
   发表时间:2007-10-09  
字体路径问题,已经解决。遇到同样问题的请参照主贴内说明。

低级错误,惭愧惭愧。
0 请登录后投票
   发表时间:2007-11-03  
我安装的是windows下面的

因为时间太久,具体步骤回忆不起来了,但是过程还算顺利
大概步骤如下:
1、去http://rubyforge.org/frs/?group_id=12&release_id=15197
下载windows版本的,注意和自己的ruby版本对应
里面有个readme.html,有安装步骤。

2、安装过程如果出错,可以到
http://rmagick.rubyforge.org/install-faq.html
来查找,我遇到的几个问题,这里都有答案

安装好后,注意默认字体似乎是有问题的,没有中文的,你可以去google搜下,有很多解决方法,有人写好了xml,下载覆盖了安装目录的即可。 还有一个方法就是,不要直接在程序中指定字体,而是指定字体文件,这需要自己把字体文件和程序一起发布(字体文件在windows\fonts目录下有),实际上我上面程序用的就是后一种方法。

linux下不是我装的,我用的虚拟主机,没法装,但是上面没有字体设置,只能自己带自己文件用,所以我更推荐后面那种带自己发布的方法。

很抱歉前面没注意到,回复迟了
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics