浏览 8679 次
锁定老帖子 主题:Rails上的RMagick使用经验之谈
精华帖 (3) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2007-09-19
我的开发平台:winXP系统 + sp2, ruby 1.8.5,Rails 1.2.3,mysql5.0.27, RMagick-1.14.1_IM-6.3.0-7-Q8.当然,以上的开发软件都是windows版的。 RMagick的使用经验 这里需要说明的是:我并不打算做一个RMagick的使用大全,而只是结合我的使用经验对一些不太容易注意到的问题进行总结。 RMagick的API可以参考www.gotapi.com RMagick的使用: 1. 安装配置在RMagick安装前,确保你的系统正确安装了ruby和rails。RMagick的 安装配置很简单:下载安装文件,解压缩后,在命令行状态下进入解压缩后的目录 ,找到RMagick的gem,如rmagick-1.14.1-win32.gem,然后命令行执行:gem rmagick-1.14.1-win32.gem,然后双击ImageMagick-6.3.0-7-Q8-windows-dll.exe进行安装,只需要根据个人情况改变安装路径即可 。这部分内容有很多文章都有过详细的介绍,还有不明白的可以搜一下。2. RMagick的基本使用(1)定义主要对象使用RMagick,重要会用到两个对象:Image和Draw。这两个对象可以形象的理解为:Image对象相当于画布,Draw对象相当于画笔。 为方便以下说明,我这样定义这两个对象: ruby 代码
参数说明:Image对象定义的前两个参数是定义图片的宽和高,后门一个定义图片的背景(可选),默认为白色。 要读取一个存在的图片,Image对象还有如下定义方式: ruby 代码
(2)对象使用方法 gc对象的主要功能有:在图片上写字,在图片上画线,把另一张图片组合到当前图片上。下面我主要说两个问题: 在图片上写中文: 主要有两个方法gc.text,gc.annotate 相关参数可以在gotapi上轻松查到。用这两个方法写系统自带的英文字体是非常方便的,gc.font,gc.font_family可以设置字体,还可以通过gc. font_style, gc.font_weight来设置斜体和粗体,它们的参数是类似Magick::ItalicStyle、Magick::NormalStyle、Magick::BoldWeight、Magick::LighterWeight这样的常量。当然还有gc.pointsize来设置字体大小,这个对于中英文是通用的。 我这里主要对写中文字体做一些介绍。由于RMagick对中文支持不好,当时使用它写中文的时候默认情况下只发现了黑体可以使用(当然是在我的windows平台下)。因为我们图片处理需要提供多种字体来写字,还考虑到发布环境在linux下,所以我们用了这样的方法:从Windows的字体文件夹c:/windows/fonts下拷贝出中文字体库到自己的工程目录中,然后通过设置gc.font来使用它们。下面是我的例子: ruby 代码
运行结果: 附件图片love1.jpg 说明:如果你想保存并运行这段代码,请保存为UTF-8的格式,否则会乱码,还要保证你当前文件的fonts目录下有这些ttf字库文件。 这里还要强调的是,在写字的时候一定要设置gc.stroke('transparent')。尽管gc.stroke最开始默认的是transparent,但我还是建议在每次写字之前设置一次,否则如果在之前使用过gc.stroke并且设置了非transparent的值,那么写出来的字会是下面这样的(我把transparent换成了red) 附件图片love2.jpg 当然,如果你想要达到这种效果则另当别论了。如果你想要写出更多的中文字体,那就去下载更多的字体库就可以了,是不是很简单? 我现在还有一个问题没有解决:不知道哪里可以下载中文字体的粗体斜体字库(如黑体,宋体,隶书、楷体等),麻烦知道的朋友告之,我的邮箱zhangxiaoyao067, gmail.com 继续罗嗦一点:对字体的设置有gc.font(ttf_file)和gc.font=ttf_file这两种方式,它们的区别在什么地方呢?还是用上面那个例子来说明。如果其中所有的gc.font(ttf_file)换成gc.font=ttf_file,那么最后的结果会是 附件图片love3.jpg 看明白了吧?也就是用“=”的时候,只有最后一个起作用。 图片裁剪: 还是用代码来说明吧 ruby 代码
说明:首先要定义一个裁剪区域,这里我定义了一个矩形区域,然后是应用。只有在裁剪区域内部的图片才会画到画布上面。这里要注意的是gc.push, gc.pop,因为gc.clip_path的裁剪会应用在gc的整个存活期内部,因此gc.draw的所有内容都会限制在这个裁剪区域内部。这两个操作相当于对裁剪应用的释放。 ok,暂时写这么多吧. 我们的网站:www.youqubar.com ,欢迎指导。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-09-20
感谢分享,最近正打算看看这个呢
|
|
返回顶楼 | |
发表时间:2007-09-20
为什么要有rails呢?
|
|
返回顶楼 | |
发表时间:2007-09-21
carlosbdw 写道 为什么要有rails呢?
的确不该加rails |
|
返回顶楼 | |
发表时间:2007-09-21
RMagick动辄100MB内存,如果你没有特别复杂的需求的话,建议使用minimagick,灰常好用,价格便宜量又足,我一直都用他
|
|
返回顶楼 | |
发表时间:2008-05-11
不晓得LZ是否遇到过" Non-conforming drawing primitive definition (Magick::ImageMagickError)"这个问题.
请问LZ的代码在RMagic1还是RMagic2下测试通过的?看文章中代码应该是在RMagic1下测的,但是我差不多的代码在Rmagic1下就是有问题了,如上的错误. 但是在RMagic2下却不存在问题(我都是在linux下做的测试) 为此,我写了一些跟踪和分析,虽然有些眉目,但是尚未最终解决,有经验的朋友帮忙瞧瞧. http://iceskysl.1sters.com/?action=show&id=275&page=1#cm253 |
|
返回顶楼 | |
发表时间:2008-05-12
最近用RMagick做验证码,从网上找了一些配置方法和代码示例拿来调,模型类这样引入rmagick
require 'rubygems' require 'rmagick' class NoisyImage include Magick ,控制器里简要写了下 session[:noisy_image] = NoisyImage.new(4) 于是调用这个Action,于是服务器down掉。并且报错: no images in this list C:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.13.6/lib/action_controller/routing.rb:546: [BUG] Segmentation fault ruby 1.8.6 (2007-09-24) [i386-mswin32] This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information. 望指教! |
|
返回顶楼 | |