画画的过程蛮好玩的。
写在前面
之前用chunky png来做图片处理,后面发现在添加线条及文字这方面,chunky png很受限,决定换成RMagick,随后又因为它吃内存的原因,换成了 mini_magick , mini_magick的用法与RMagick较相似,这里记录下RMagick的draw用法【单纯觉得很好玩 : P】,另,安装的时候,踩了点坑,顺带把安装也写写。
安装
Mac OS下:
brew install imagemagick
gem install rmagick
如果已经安装了imagemagick,则:
brew upgrade imagemagick
gem install rmagick
对于Mac OSX Sierra (and High Sierra),安装的时候,可能还是失败,看日志,可能会出现这样的报错信息:
Can't install RMagick 2.16.0. Can't find MagickWand.h.
如何解决?参考这个RMagick installation: Can’t find MagickWand.h
终端输入:
brew unlink imagemagick
brew install imagemagick@6 && brew link imagemagick@6 --force
然后:
gem install rmagick
OK,你已经get到了这个轮子,看看怎么使用吧。
使用
RMagick不仅仅可以用来给图片添加线条和文字,它还可以新建,读写图片等,戳官网详见。
重点看它的draw类。【因为我觉得Drawing on and adding text to images是它最cool的功能点:P】
这里用两个简单的例子说一下如何添加文字和线条。
添加线条
以添加一个方框为例,新建
demo.rb
:require 'RMagick' include Magick demo = ImageList.new("demo.png") # 建image对象,这里demo.png是存在的,若要新建一张图片,可以用Image.new border = Magick::Draw.new # 建draw实例 border.stroke('rgb(255,0,0)') # 线条颜色,这里红色 border.fill('transparent') # 填充色,这里不填充,选透明 border.stroke_width(4) # 线条宽度 border.rectangle(100, 100, 500, 500) # 方框线条的位置,左上角起始点,右下角终止点 border.draw(demo) # 给demo画上 demo.write('demo.png') # 保存
这里,demo.png本来是一张空白图片:【不要怀疑,我真的放了一张空白的图片】
终端运行
ruby demo.rb
后,demo.png成了这样:好玩吧?还可以画其他的,比如圆形,星星等等,比如我们画个星星:
require 'RMagick' include Magick demo = ImageList.new("demo.png") star = Magick::Draw.new star.stroke('red').stroke_width(3) star.fill('yellow') star.polygon( 75,37.5, 89.5,80.5, 134.5,80.5, 98.5,107.5, 111.5,150.5, 75,125, 38.5,150.5, 51.5,107.5, 15.5,80.5, 60.5,80.5) star.draw(demo) demo.write('demo.png')
运行后,效果图:
画图基本的套路就是这样,想画画其他的?看它的draw class的文档。
添加文字
还是用demo.png,我们看看如何在空白页上添加文字:
require 'RMagick' include Magick demo = ImageList.new("demo.png") Text = 'I Love Ruby!' # 需要添加的文字 text = Magick::Draw.new text.font_family = 'helvetica' # 字体 text.pointsize = 60 # 大小 text.gravity = Magick::CenterGravity # 字的朝向,这里是区域的中心 # 调用annotate(img, width, height, x, y, text)这个method给demo添加文字, width, height, x, y决定字体的摆放位置 # 把文字当成一个长方形,width, height是起始位置【gravity设定的起始点】,x, y是偏移量. fill是填充色 text.annotate(demo, 0,0,2,2, Text) { self.fill = 'red' } demo.write('demo.png')
效果图:
哈哈,是不是很cool?我就抛砖引玉,剩下的,看文档,自己玩吧!