ruby中使用MiniMagick处理图片

作者: Jones.Zhao
发布时间:2015-06-24 13:31:26

我曾经写过两篇关于和web开发中处理图片有关的文章,一篇是在PHP中如何裁剪图片,对比了ECShop/Babel这两套系统的做法,侧重于对图片本身的操作;另一篇是在rails项目中如何上传图片,侧重于上传并保存的策略,即使上传的是pdf文档,也一样适用。

最近我手头的项目里需要提供用户上传图片作为头像的功能,于是需要有一些后端的处理过程,比如裁剪、缩放。项目基于Rails框架,所以得找ruby上的实现。有人会推荐用attachment_fu/file_column这些插件,都显得太麻烦,我要的只是用户上传之后,经过适当裁剪,然后缩放到想要的尺寸。仅此而已。花了半天时间来研究,中文的参考资料有限,我把我的收获写下来,希望能对大家有帮助。

原来想用RMagick,但据说内存泄露的问题比较厉害,作为替代品MiniMagick不存在内存泄露的问题。而二者都是使用ImageMagick的,所以需要下载并安装ImageMagick。之后使用”gem install mini_magick“安装好MiniMagick,基础设施就搭建好了。

在开始之前,先思考一下,用于做用户头像的图片应该如何裁剪?我的考虑是所有用户采用同样的尺寸,比如48×48。但用户上传的图片往往不是正方形的,如果直接缩小到正方形,人像必然会变形。所以需要先切除一部分,把图片切成正方形,然后再缩小到想要的尺寸。

原始图片

上面是原始图片(尺寸为2048×1536),先把它变成正方形。我能想到的最好办法就是在左右两边各截掉一部分,使处理后宽度和高度相等,这样能留下中间主体部分。如图(阴影部分为裁去部分,示意图不保证精确):

裁剪示意

对于高度大于宽度的图片这招一样适用。得到中间的部分再进行缩放,就可以保证图片不失真。下面看看具体实现。

MiniMagick中Image对象有一个shave方法,正好可以满足这个需求。在irb中运行:

require ‘mini_magick’

img = MiniMagick::Image.from_file “1.jpg”

#取得宽度和高度

w,h = img[:width],img[:height] #=> [2048, 1536]

shaved_off = ((w-h)/2).round #=> 256

img.shave “#{shaved_off}x0″ #此处表示宽度上左右各截取256个像素,高度上截取0像素

img.write “2.jpg”

在使用shave方法处理后,图片已经是正方形了(像素数1536×1536)。此时保存得到的2.jpg如图:

第一步裁剪

之后想得到不同尺寸的缩略图,只消调用resize方法。

img.resize 100

img.write “3.jpg”

得到的3.jpg如下图:

缩放之后

当然,想要其他尺寸也可以多次调用resize。这个示例只是在irb中操作,在实际的项目中,应该先判断一下宽度和高度哪个大,决定从哪个维度上截取,也需要考虑一下存储策略。但总体来说,只要调用一次shave,调用一次resize,就能达到目的。

参考:http://atomgiant.com/2006/07/19/resizing-images-with-minimagick/

标签: Ruby
来源:http://www.cnblogs.com/stalwart/archive/2010/10/24/1859608.h

推荐: