使用RMagick来给图片添加线条或文字

画画的过程蛮好玩的。

写在前面

之前用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?我就抛砖引玉,剩下的,看文档,自己玩吧!

参考

RMagick installation: Can’t find MagickWand.h

how to use RMagick

class Draw