`
zy13
  • 浏览: 44322 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Rails上的RMagick使用经验之谈

阅读更多

我的开发平台: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 代码
 
  1. require ‘rmagick’ //千万别忘了在文件开头加上这段代码  
  2. canvas = Magick::Image.new(width,height,Magick::HatchFill.new(bg_color,bg_color))  
  3. gc = Magick::Draw.new  

参数说明:Image对象定义的前两个参数是定义图片的宽和高,后门一个定义图片的背景(可选),默认为白色。
要读取一个存在的图片,Image对象还有如下定义方式:
ruby 代码
  1. img=Magick::Image.read(image_path).first  //image_path是字符串形式的图片路径  
  2. Image对象定义后,根据img.rows和img.columns可以获得它的高度和宽度。  

(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 代码
 
  1. require 'RMagick'  
  2.   
  3. img = Magick::Image.new(200,200,Magick::HatchFill.new('green','green'))  
  4.   
  5. gc = Magick::Draw.new  
  6. gc.stroke('transparent')  
  7. gc.pointsize(24)  
  8. gc.font("fonts/STCAIYUN.TTF")  
  9. gc.text(20,40, '我爱你啊')  
  10.   
  11. gc.font("fonts/STXINWEI.TTF")  
  12. gc.text(20,70, '我爱你啊')  
  13.   
  14. gc.fill('white')  
  15. gc.font("fonts/FZSTK.TTF")  
  16. gc.text(20,100, '我爱你啊')  
  17.   
  18. gc.font("fonts/simhei.ttf")  
  19. gc.text(20,130, '我爱你啊')  
  20.   
  21. gc.font("fonts/yihejianti.TTF")  
  22. gc.text(20,160, '我爱你啊')  
  23.   
  24. gc.draw(img)  
  25. img.write('love.jpg')  

运行结果:
  附件图片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 代码
  1. gc.define_clip_path('clip_pic'){  
  2.               gc.stroke_width(0)  
  3.               gc.rectangle(lefttop_x,lefttop_y,rightbottom_x,rightbottom_y)}         
  4. gc.push  
  5. gc.clip_path('clip_pic')  
  6. gc.composite(x, y, width, height,Magick::Image.read(myImageUrl))  
  7. gc.pop  

说明:首先要定义一个裁剪区域,这里我定义了一个矩形区域,然后是应用。只有在裁剪区域内部的图片才会画到画布上面。这里要注意的是gc.push, gc.pop,因为gc.clip_path的裁剪会应用在gc的整个存活期内部,因此gc.draw的所有内容都会限制在这个裁剪区域内部。这两个操作相当于对裁剪应用的释放。
ok,暂时写这么多吧.
我们的网站:www.youqubar.com ,欢迎指导。
  • 大小: 19 KB
  • 大小: 19.2 KB
  • 大小: 20 KB
分享到:
评论
7 楼 kiol 2008-06-26  
我用Rmagic 2.0,中文总是显示的是“?”。
什么原因啊?
用的是STXINWEI.TTF字体。
6 楼 shaka 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.

望指教!
5 楼 iceskysl 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
4 楼 刑天战士 2007-09-21  
RMagick动辄100MB内存,如果你没有特别复杂的需求的话,建议使用minimagick,灰常好用,价格便宜量又足,我一直都用他
3 楼 zy13 2007-09-21  
carlosbdw 写道
为什么要有rails呢?

的确不该加rails
2 楼 carlosbdw 2007-09-20  
为什么要有rails呢?
1 楼 笨笨狗 2007-09-20  
感谢分享,最近正打算看看这个呢

相关推荐

    rmagick-2.10.0.gem

    rails 插件rmagick 2.10.0 gem

    rmagick-2.16.0.gem

    安装redmine-3.2.3 ruby on rails 下的插件 rmagick 2.16.0 gem

    Rails3 使用rake启动后台任务

    以下是一些关于如何在 Rails3 中使用 rake 启动后台任务的知识点: 1. **Rakefile**: 每个 Rails 项目都有一个 Rakefile 文件,这是 Rake 执行任务的入口点。在这个文件中,你可以定义自定义的任务。 2. **Task ...

    使用Aptana+Rails开发Rails Web应用(中文)

    本教程将详细介绍如何使用Aptana与Rails结合,创建一个功能完备的Web应用程序。 首先,我们需要安装Aptana Studio。你可以从其官方网站下载最新版本的安装包。安装过程中,遵循提示进行,确保选择自定义安装并勾选...

    Rails项目源代码

    Rails的路由系统将URL映射到控制器的行动上,如`/sign_up`可能对应`users#new`,用于创建新用户。`config/routes.rb`文件定义了所有路由规则,包括资源路由、命名路由和自定义路由。 6. **视图模板**: 视图使用...

    Rails 101 入门电子书

    - 安装Rails: 使用gem工具安装最新的Rails版本。 - 测试安装: 创建一个简单的Rails应用来验证是否成功安装。 #### 五、练习作业0-Hello World - **目标**: - 学习如何创建第一个Rails应用程序。 - **过程**: -...

    bower-rails, 在 Rails 上,为 Bower 设置类似 DSL + rake任务.zip

    bower-rails, 在 Rails 上,为 Bower 设置类似 DSL + rake任务 rails Bower 对 Rails 项目的支持。 依赖文件是 Rails root 目录中的bower.json,如果使用 DSL,则为 Bowerfile 。 查看最新变更和发布的变更日志文件...

    关于rails 3.1 cucumber-rails 1.2.0

    Cucumber-Rails集成了Cucumber与Rails,使得开发者能够在Rails环境中方便地使用Cucumber进行功能测试。 在 Rails 应用中使用 Cucumber-Rails,开发者可以创建一个名为`features`的目录,里面包含这些Gherkin特性...

    rails中使用javascript日期控件

    在Rails开发中,为了增强用户体验,常常需要使用JavaScript来处理日期选择和管理。这篇博客“rails中使用javascript日期控件”探讨的就是如何在Rails应用中集成JavaScript日期控件,特别是通过一个名为WebCalendar....

    Rails101_by_rails4.0

    综上所述,《Rails101_by_rails4.0》不仅是一本Rails自学书籍,它还代表了一种新的出版和学习理念。对于希望学习Rails框架,尤其是希望学习Rails 4.0版本的开发者来说,这本书提供了全面而系统的知识体系,并结合...

    Ruby-GoOnRails使用Rails生成器来生成一个Golang应用

    这个工具简化了在Rails项目中使用Go进行后端处理的流程,使开发者可以利用Go的性能优势处理高并发请求,同时保留Rails的便捷开发体验。 ### 2. 安装`GoOnRails` 首先,确保你的系统已经安装了Rails和Go。接下来,...

    rails-settings, 使用 Ruby on Rails 管理设置.zip

    rails-settings, 使用 Ruby on Rails 管理设置 Rails的设置 ruby gem,通过在单独的数据库表中将它们存储为序列化的哈希来处理。 包含命名空间和默认值。要求ruby 1.9.3或者更高版本Rails 3.1或者更高版本( 包括 ...

    在rails中 使用RSpec生产CHM文档

    标题 "在Rails中使用RSpec生产CHM文档" 暗示了这个话题是关于如何在Ruby on Rails(简称Rails)框架中使用RSpec测试工具来创建帮助文档,特别是以CHM(Microsoft Compiled HTML Help)格式。CHM文件是一种常见的...

    rails2.3.2gem本地安装包及使用说明

    - 如果你遇到任何问题,查阅 Rails 2.3.2 的官方文档或社区资源,例如 Stack Overflow 上的相关问题,可能会有所帮助。 6. **安全与升级** - 考虑到 Rails 2.3.2 已经非常过时,可能存在大量的安全漏洞。在生产...

    rails指南 中文版

    5. **Gemfile与Bundler**:Rails项目通常使用Gemfile来管理依赖库,Bundler工具则用于安装和管理这些依赖,确保在不同环境下项目的运行一致性。 6. **Scaffolding**:Rails提供了快速生成基本CRUD(Create, Read, ...

    Ruby on Rails Guides v2 - Ruby on Rails 4.2.5

    - **步骤**:通过命令行使用`rails new project_name`来初始化一个新的Rails项目。 - **结构**:新项目将包含默认的目录结构,如`app`、`config`、`db`等,分别用于存放应用程序代码、配置文件、数据库迁移脚本等。 ...

    rails, Ruby on Rails.zip

    rails, Ruby on Rails 欢迎使用 RailsRails 是一个web应用程序框架,它包括根据 Model-View-Controller ( MVC ) Pattern 创建数据库备份的web应用程序所需的所有内容。理解 MVC Pattern 是理解 Rai

    rails敏捷开发的购物车系统

    使用RSpec进行行为驱动开发(BDD)测试,Rake任务自动化测试执行,确保购物车系统在功能上和性能上的健壮性。 总结,构建Rails敏捷开发的购物车系统涉及了模型-视图-控制器架构的运用、数据库设计、路由配置、会话...

    rails2-sample

    掌握Ruby语言是学习Ruby on Rails的前提条件,因为Rails正是建立在Ruby之上的。 #### 4. Rails Revealed(揭示Rails) 这部分内容会更进一步地探索Rails的内部机制,包括其架构、工作流程以及一些高级特性。例如,...

Global site tag (gtag.js) - Google Analytics