现在做的网站需要保存用户上传的图片,同时需要进行压缩和图片切割等特殊效果的处理。
一开始我们用的是JMagick+ ImageMagick处理用户上传的图片,但是存在一个非常严重的问题,Tomcat在跑了大概10天左右后会crash掉,异常内容为:
- magick.MagickException: Unable to retrieve handle
从表象看,应该是没有释放ImageMagick的句柄导致的,查找API后发现程序中没有调用
- magick.MagickImage.destroyImages() Called by finalize to deallocate the image handle.
在程序加上本方法,情况有所改善,大概在40天左右后出现了一次tomcat进程crash。
似乎并没有从本质上找到问题的根本。。。
在JMagick的邮件列表中找到一份我认为有价值的邮件,http://sourceforge.net/mailarchive/message.php?msg_name=20cf28cd1002231148s33c99843q875f59906dd32b8b%40mail.gmail.com
里面讲到了JMagick作为应用服务的缺点,并建议可以使用IM4JAVA:
- The "JNI hazard" here is that if something you use (f.ex libtiff for reading
- TIFF files) has a memory bug then it can make your whole JVM crash. Thats of
- course frustrating and therefore its great to have im4java around, which
- starts IM as an external process, so JVM crashes are avoided.
- * *
- Coolest thing would be if JMagick and im4java could have the same API so it
- was easy to switch depending on luckyness. Ive asked the author of im4java
- to attemt to be as compatible as possible, but as im4java is very much
- different internally its limited how much can be done in that direction.
- If you don't like the risk, stick to im4java. If your want optimal
- performance give JMagick a try.
- And, its not JMagick that is buggy, its what it depends on (hereunder IM)
- that is not always (memory) bug free on long running processes.
- I also have never seen a mismatch between JMagick binary and ImageMagick
- binaries leading to crashes.
所以我把思路转向了IM4Java。
IM4Java的官网 http://im4java.sourceforge.net/index.html 。
在 Developer's Guide 中提到im4java支持ImageMagick和GraphicsMagick。GraphicsMagick是ImageMagick的一个分支,相对于ImageMagick而言,TA处理速度更快,消耗资源更少,并且大的图片处理网站,如 Flickr andEtsy 已经在使用TA了。
下载GraphicsMagick的Q8版本(还有Q16、Q32的,版本见的区别可以查看ImageMagick的官网,大致意思是每像素用多少bit来存储信息,16、32要比8消耗更多的内存^_^)。
下面这段话是在GraphicsMagick的邮件列表中找到的:
- > I've got question about IM Q16 & Q8. What's a difference between that two versions?
- I know, that Q16 version takes 2 times more memory than Q8.
- But is that so great precision in algorithm is needed in converting jpegs, gif or pngs
- (I need IM for converting that types of formats)
- & JPEG and GIF only have 8-bit versions, so there will almost certainly be no benefit to using Q16.
- It is possible to have 16-bit PNGs, but if you have to ask, you probably don't have to worry about it
安装GraphicsMagick和IM4Java非常简单,按照官网做就ok了,下面是一个简单的例子:
- /**
- * 先缩放,后居中切割图片
- * @param srcPath 源图路径
- * @param desPath 目标图保存路径
- * @param rectw 待切割在宽度
- * @param recth 待切割在高度
- * @throws IM4JavaException
- * @throws InterruptedException
- * @throws IOException
- */
- public static void cropImageCenter(String srcPath, String desPath, int rectw, int recth) throws IOException, InterruptedException, IM4JavaException
- {
- IMOperation op = new IMOperation();
- op.addImage();
- op.resize(rectw, recth, '^').gravity("center").extent(rectw, recth);
- op.addImage();
- ConvertCmd convert = new ConvertCmd(true);
- //convert.createScript("e:\\test\\myscript.sh",op);
- convert.run(op, srcPath, desPath);
- }
我的头像就是用这个方法压缩的,源图为:
原始尺寸为578*800,大小为68.8KB,处理后为180*180,大小为 6.15KB
在我的机器上使用LoadRunner进行了压力测试,并发10用户的情况下,每秒能处理11张左右的图片。
我的机器配置为:
Inter(R) Pentium(R) D CPU2.80GHz, 2.00GB 内存,迈拓 6V160E0 7200rpm
操作系统为 Windows server2003 Enterprise Edition Service Pack 2
相关推荐
Nginx+Lua+GraphicsMagick实现动态生成指定尺寸的图片
缩略图OpenResty(Nginx)+Lua+GraphicsMagick
关于使用Tengine+Lua+GraphicsMagick实现图片自动裁剪缩放的开发文档。
将图片的上传,分布式管理 交由seaweedfs管理,可提供更快的响应速度,更方便,无痛的分布式扩展节点,billion 级别的。后面使用openresty + lua-resty-weedfs + graphicsmagick 生成缩略图功能独立处理。
ChineseWaterMark IM4JAVA+GraphicsMagick实现中文水印
实现图片自动伸缩功能(Tengine+Lua+GraphicsMagick)
教你如何搭建一个图片切割和缩放的服务 1.搭建GraphicsMagick服务 2.配置nginx 3.修改Lua脚本 详情见文档
GraphicsMagick号称图像处理领域的瑞士军刀。 短小精悍的代码却提供了一个鲁棒、高效的工具和库集合...本文档详细的介绍了 GraphicsMagick+im4java的搭建过程,对一些搭建过程中出现的问题进行了详细的解答,避免采坑。
使用GraphicsMagick处理图片 添加水印 合成图片 图片转换 图片处理
GraphicsMagick是图像处理技术,集成java demo,实现裁剪、合成等功能
GraphicsMagick能够动态的生成图片,特别适用于互联网的应用。可以用来处理调整尺寸、旋转、加亮、颜色调整、增加特效等方面。GaphicsMagick不仅支持命令行的模式,同时也支持C、C++、Perl、PHP、Tcl、 Ruby等的调用
对于Java开发者来说,常用的图片处理工具有3个,JDK自带的图片处理库,ImageMagick,GraphicsMagick。JDK自带的图片处理库,虽稳定简单,性能却比较差;ImageMagick是目前最流行的图片处理工具,它的功能非常丰富;...
nginx+lua-fastdfs+GraphicsMagick-master配置,主要是介绍lua跟nginx的结合的使用可以动态的生成不同尺寸的图片。
GraphicsMagick 是一个用来读写、生成超过 90 种图像格式的工具集合,可以对图片进行格式参数处理,支持包括 TIFF, JPEG, JPEG-2000,PNG, PDF, PhotoCD, SVG, 和 GIF 等图像格式。GraphicsMagick 是基于 ImageMagick...
GraphicsMagick图片库GraphicsMagick-1.3.26.tar.xz Java图片处理 - 安装ImageMagick库使用convert命令 - 文章中的辅助文件 http://blog.csdn.net/chwshuang/article/details/64921665
Docker+FastDFS+Nginx+Lua实现图片缩略图1、FastDFS安装1.1、镜像下载1.2、开启tracker容器1.3、开启storage容器1.4、测试2、FastDFS集成Nginx+lua2.1、依赖包下载2.2、安装软件基础包2.3、依赖安装2.4、配置Lua脚本...
GraphicsMagick 图片处理案例,安装包,LINUX环境解压配置环境变量安装
nginx-lua-GraphicsMagick Nginx + Lua + GraphicsMagick,实现自定义图片尺寸功能,支持两种模式[固定高宽模式,定高或定宽模式],支持FastDFS文件存储github地址: : 说明类似淘宝图片,实现自定义图片尺寸功能,...
GraphicsMagick图片截取软件全套及相应的demo 已经运用到项目里面