现在做的网站需要保存用户上传的图片,同时需要进行压缩和图片切割等特殊效果的处理。
一开始我们用的是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实现动态生成指定尺寸的图片
GraphicsMagick是一个强大的图片处理工具,可以动态地生成图片,特别适用于互联网的应用。 GraphicsMagick可以对图片进行裁剪、等比缩放、增加特效等处理。在本解决方案中,GraphicsMagick将负责对图片的处理。 在...
将图片的上传,分布式管理 交由seaweedfs管理,可提供更快的响应速度,更方便,无痛的分布式扩展节点,billion 级别的。后面使用openresty + lua-resty-weedfs + graphicsmagick 生成缩略图功能独立处理。
GraphicsMagick是一个跨平台的图像处理工具,它支持大量的图像格式,并提供了丰富的API用于创建、编辑和转换图像。在OpenResty环境中,我们可以通过Lua调用GraphicsMagick的命令行接口,进行缩略图的生成、裁剪、...
总结起来,"Tengine+Lua+GraphicsMagick实现图片自动伸缩功能(ubuntu版)"提供了一种高效且灵活的图片处理方案,适用于需要处理大量图片的网站,有助于提升用户体验和服务器性能。通过学习和应用这种技术,开发者可以...
GraphicsMagick号称图像处理领域的瑞士军刀。 短小精悍的代码却提供了一个鲁棒、高效的工具和库集合...本文档详细的介绍了 GraphicsMagick+im4java的搭建过程,对一些搭建过程中出现的问题进行了详细的解答,避免采坑。
**Nginx-Lua-GraphicsMagick:搭建高效图片处理服务** 在当今互联网时代,图片是网站内容的重要组成部分,无论是社交媒体、电子商务还是个人博客,都需要处理大量的图片。为了提高图片处理效率并减轻服务器负担,...
3. **处理图片**:通过调用IM4JAVA的`convert`方法,将上述参数转化为GraphicsMagick可执行的命令,然后执行该命令在目标图片上添加水印。 4. **异常处理**:在Java代码中,应该加入适当的错误处理机制,以应对可能...
在本文中,我们将深入探讨如何利用GraphicsMagick进行图片处理,并通过一个Java Demo程序——ImageUtil.java来展示其实现。 首先,GraphicsMagick-1.3.25-Q16-win64-dll.exe是GraphicsMagick在Windows平台上的安装...
GraphicsMagick在这些领域中占据一席之地,它的应用不仅限于简单的照片编辑,还可以应用于科学可视化、数据可视化、网站开发、移动应用、服务器端图像处理等多个行业。 "gm"可能是压缩包内的主要程序或者脚本文件,...
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脚本...
对于Java开发者来说,常用的图片处理工具有3个,JDK自带的图片处理库,ImageMagick,GraphicsMagick。JDK自带的图片处理库,虽稳定简单,性能却比较差;ImageMagick是目前最流行的图片处理工具,它的功能非常丰富;...
GraphicsMagick能够动态的生成图片,特别适用于互联网的应用。可以用来处理调整尺寸、旋转、加亮、颜色调整、增加特效等方面。GaphicsMagick不仅支持命令行的模式,同时也支持C、C++、Perl、PHP、Tcl、 Ruby等的调用
GraphicsMagick是一款强大的开源图像处理工具,它支持多种图片格式,并提供了丰富的命令行接口来执行各种图像操作,如转换、裁剪、缩放、旋转、颜色调整等。在这个"GraphicsMagick图片截取软件全套及相应的demo.rar...
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
GraphicsMagick是一款强大的开源图像处理工具,用于读取、转换和写入多种图像格式。它提供了命令行界面,使得在各种脚本环境中处理图像变得简单。这个安装包是GraphicsMagick的1.3.40版本,包含了适用于不同操作系统...
另一个文件`TIM图片20200606144710.jpg`似乎是一个测试图像,可能用于验证GraphicsMagick安装是否成功,或者用于演示其图像处理功能。你可以使用GraphicsMagick的命令行工具来查看、转换或操作这个图像,以此了解其...
GraphicsMagick是一个强大的开源图像处理工具,用于读取、转换和写入多种图像格式。它在许多操作系统上都能运行,包括Windows、Linux和Mac OS X等。GraphicsMagick源自ImageMagick项目,但在某些方面提供了更快的...
GraphicsMagick的功能包括图片转换、裁剪、缩放、旋转、颜色调整等,广泛应用在Web服务器、自动化脚本以及图像处理软件开发中。 在Linux环境下安装GraphicsMagick,首先需要更新系统包列表,通常使用`apt-get`...