在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
我曾经写过两篇关于和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中运行:
在使用shave方法处理后,图片已经是正方形了(像素数1536×1536)。此时保存得到的2.jpg如图: 之后想得到不同尺寸的缩略图,只消调用resize方法。
得到的3.jpg如下图: 当然,想要其他尺寸也可以多次调用resize。这个示例只是在irb中操作,在实际的项目中,应该先判断一下宽度和高度哪个大,决定从哪个维度上截取,也需要考虑一下存储策略。但总体来说,只要调用一次shave,调用一次resize,就能达到目的。 参考:http://atomgiant.com/2006/07/19/resizing-images-with-minimagick/ |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论