现在做的网站需要保存用户上传的图片,同时需要进行压缩和图片切割等特殊效果的处理。
一开始我们用的是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
and Etsy 已经在使用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
- 大小: 68.9 KB
分享到:
相关推荐
ChineseWaterMark IM4JAVA+GraphicsMagick实现中文水印
Nginx+Lua+GraphicsMagick实现动态生成指定尺寸的图片
GraphicsMagick号称图像处理领域的瑞士军刀。 短小精悍的代码却提供了一个鲁棒、高效的工具和库集合...本文档详细的介绍了 GraphicsMagick+im4java的搭建过程,对一些搭建过程中出现的问题进行了详细的解答,避免采坑。
缩略图OpenResty(Nginx)+Lua+GraphicsMagick
关于使用Tengine+Lua+GraphicsMagick实现图片自动裁剪缩放的开发文档。
将图片的上传,分布式管理 交由seaweedfs管理,可提供更快的响应速度,更方便,无痛的分布式扩展节点,billion 级别的。后面使用openresty + lua-resty-weedfs + graphicsmagick 生成缩略图功能独立处理。
实现图片自动伸缩功能(Tengine+Lua+GraphicsMagick)
教你如何搭建一个图片切割和缩放的服务 1.搭建GraphicsMagick服务 2.配置nginx 3.修改Lua脚本 详情见文档
GraphicsMagick是图像处理技术,集成java demo,实现裁剪、合成等功能
im4java-1.4.0.jar,用于ImagineMagick和GraphicsMagick
使用GraphicsMagick处理图片 添加水印 合成图片 图片转换 图片处理
GraphicsMagick能够动态的生成图片,特别适用于互联网的应用。可以用来处理调整尺寸、旋转、加亮、颜色调整、增加特效等方面。GaphicsMagick不仅支持命令行的模式,同时也支持C、C++、Perl、PHP、Tcl、 Ruby等的调用
对于Java开发者来说,常用的图片处理工具有3个,JDK自带的图片处理库,ImageMagick,GraphicsMagick。JDK自带的图片处理库,虽稳定简单,性能却比较差;ImageMagick是目前最流行的图片处理工具,它的功能非常丰富;...
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
nginx+lua-fastdfs+GraphicsMagick-master配置,主要是介绍lua跟nginx的结合的使用可以动态的生成不同尺寸的图片。
基于imagemagick 的一个版本的分支,是属于图像处理工具,功能强大,和im4java组合完成java对图片的处理功能。
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环境解压配置环境变量安装