January 22nd, 2009 by 张磊
我曾经写过两篇关于和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/
August 20th, 2007 by 张磊
相关文章: 1. 安家 ———————————————————————————————– 在昨天的文章里我们已经安好了家,就像在家里摆放家具一样,一个崭新的WordPress是需要主人来配置的。今天blogkid就来写写,如何配置一个WordPress。当然,只会讲一些大家都要用到的东西,自己去折腾WP还是必要的,是种乐趣。 模板: 首先,给blog换个皮肤吧。如果你真的喜欢默认皮肤的简洁风格,那就别换。想换个皮肤的朋友们,到后台访问“外观”页面,英文WP的话会是“Presentation”。如图: 可以看到,我用的是一款叫做Unnamed One 的皮肤,已经用了好久,是我用WP的最爱啊。我在自己的技术博客上,也用了这一款皮肤,不过版本更新了。在这里,点一下模板的图片,就会切换使用这模板,很是方便。没有模板怎么办呢?别急,可以到这里选好了心仪的模板,下载、解压,然后上传到WP的/wp-content/themes/文件夹里,然后刷一下外观这个页面,看到了吧,刚上传的模板已经出来了。 选好模板之后,有些模板会有自己的设置(这属于比较高级的),比如可以选择两栏还是三栏,侧栏靠左还是靠右等等,这些大家自己去体验吧。下一步,我们配置插件。 插件: 如果你用WP而不用插件,那就太差了。WP有数不清的可以实现各种功能的插件,有一些朋友还不甘寂寞,自己动手写插件。blogkid今天想介绍的,是一些必要的插件。在管理后台的导航栏上有一个“插件”的链接,单击就到了插件管理的页面上,就不抓图了。所有的插件,都可以通过简单的点击来实现“启用”或“禁用”。今天想要介绍的插件有: 1、Akismet :这是一个可以自动阻挡垃圾评论的插件。有人说Spam Karma 2更好用,但我用Aksimet已经足够了。而且这个插件一般是WP装好就带着的。如果你的blog以后出现了大量的垃圾评论,别怪我没提醒你哦。 2、WordPress 数据库备份:数据库备份的重要性就不必说了吧,这个小巧的插件可以以多种方式来备份,保存到服务、或是下载到本地,也可以发送到邮箱,简单快捷。 3、Google Sitemaps :Sitemap是什么?如果你不知道的话就去Google一下。这个插件可以自动生成给搜索引擎看的Sitemap,对blog在SEO方面很有臂助。当然,光用这个插件还不够,你还得到Google网络管理员工具那里,给你的blog添加一个Sitemap。 以下的插件觉得也值得试试,但blogkid后来都不用了: 4、Ultimate Tag Warrior : 这个是个可以给文章添加Tag的插件,我曾经有一段在用它。但是事实证明它对中文支持不好,总会丢数据,而且也影响了我blog的搜索。所以我禁用了它。但是,在我的技术博客上,它工作得很好。 5、wp-cache :这是WP的缓存插件,据说可以让WP快很多。但是别忘了缓存的工作原理。在命中率低的时候,反而会拖慢系统的速度。一开始写blog没必要用这个,等到你有Fenng一半流量的时候,再考虑它吧。 6、CoolCode :这个插件是为了给文章里的程序代码加亮。如果你习惯在blog里写点自己技术上的心得,可以试试这个插件。 插件的安装和模板的安装很相似,不同的是,你应该上传到/wp-content/plugins/文件夹 选项: 在后台导航栏点选项,会出来一大堆的设置。 在这里,可以给blog写一个副标题。副标题给我的感觉就像Gtalk的签名一样,可以反映自己的心情。当然,也有不变副标题的,比如Fenng的blog上副标题就很有DBA的感觉,堪称经典。同时,如果你是在国外的主机上装WP,别忘记在下面把时区改成“+8”。 选项里还有一个需要注意的就是“永久链接”。这里的永久链接可以让blog上的动态文章有静态的感觉。看看我的blog上每篇文章的地址格式,比如这个:http://www.blogkid.net/archives/942。哪里能看出这是PHP写的系统呢?更重要的是,可以通过这种方式构建对搜索引擎友好的网页。所以赶快扔掉形如http://www.blogkid.net/?p=942这样的链接吧,永久链接里面随便选一个都好。但是,切记,不要经常更改链接的方式,要不那还叫什么“永久链接”啊。地址的频繁变化会让Google很烦的。 用户: 在导航栏的“插件”和“选项”之间,还有一个“用户”。点进去可以设置自己的配置文件。去Google搜索一下“张磊”,为什么这个blog排在第一呢?为什么不是模特张磊,不是一汽老总张磊,不是微软研究院张磊?很大的原因就是我在配置文件的昵称里面写上了“张磊”,然后每发一篇文章,作者那里都会显示我名字。这样长此以往,想不排到前面也难。 所以,把那个地方改成你的名字吧 友情链接: 最后来讲讲友情链接,这完全是体力劳动。加吧,把自己的朋友们的blog或是网站都放在里面,当然,也记得让他们加你的链接哦。 经过这些简单的配置,相信这个WP已经比较好使了。但我们还有很多事情要做,比如模板往往不能满足我们所有的需求,需要来下自定义。呵呵,这些时候更需要我们有些技术的背景。做一个独立blogger最大的好处就是,整个网站都是你可以控制的,尽情地探索WP吧!
November 15th, 2006 by 张磊