`
javantsky
  • 浏览: 84267 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

IM4JAVA+GraphicsMagick处理网站图片

阅读更多

    现在做的网站需要保存用户上传的图片,同时需要进行压缩和图片切割等特殊效果的处理。

    一开始我们用的是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
10
1
分享到:
评论
25 楼 WU13_2008 2016-01-06  
如何设置 压缩率,,及分辨率
24 楼 shaoshanwoaini 2015-07-20  
哥,能不能告诉我怎么把一张大图分割成若干份?
23 楼 clean1981 2015-01-04  
初学者,我想问一下GraphicsMagick和IM4JAVA的关系到底是什么呢。。如果GraphicsMagick是服务器的话,你上面的代码为什么没看见URL地址呢。。
22 楼 levin_china 2014-07-03  
处理40M以上的图片就会出现错误,gm convert: Image pixel limit exceeded (see -limit Pixels)
21 楼 xinqing08007 2013-10-12  
Cannot run program "gm": CreateProcess error=2, ?????????
20 楼 zuoguiyefengliu 2013-03-13  
Cannot run program "gm": CreateProcess error=2, ?????????
19 楼 javantsky 2013-01-24  
oyang54 写道
javacreator 写道
中文是乱码,楼主有什么办法吗?
文本怎么换行?我测试的时候文本太长就只显示一部分

有解决方案了吗,相告一下,多谢.javaouyang@sina.com

如果要求效果非常好的话,建议用图片做水印。。。
18 楼 oyang54 2013-01-08  
javacreator 写道
中文是乱码,楼主有什么办法吗?
文本怎么换行?我测试的时候文本太长就只显示一部分

有解决方案了吗,相告一下,多谢.javaouyang@sina.com
17 楼 javacreator 2012-03-25  
中文是乱码,楼主有什么办法吗?
文本怎么换行?我测试的时候文本太长就只显示一部分
16 楼 jiangkan12 2011-12-21  
javantsky 写道
sunlightcs 写道
引用
ConvertCmd convert = new ConvertCmd(gm); 



这个gm是什么呢?


IM4JAVA是同时支持ImageMagick和GraphicsMagick的,这里是bool值,如果为true则使用GM,如果为false支持IM。

同问啊!!!!~~~~~
15 楼 liuyong0818 2011-12-20  
javantsky 写道
jerryqiu007 写道
加水印的例子有吗

简单做了一个例子,你可以参考下。
                IMOperation op = new IMOperation();		
		
		op.font("Arial").fill("red").draw("text 100,100 www.7dian.com");
		op.addImage();
		op.addImage();
		
		ConvertCmd convert = new ConvertCmd(gm);
		//convert.createScript("d:\\myscript.sh",op);
		convert.run(op, "d:\\test.jpg", "d:\\test2.jpg");


改成中文水印会乱码的
14 楼 sunlightcs 2011-08-21  
前段时间,我写用这工具处理了用户上传的图片,地址:http://www.juziku.com/wiki/2104.htm   
13 楼 zs001987 2011-08-09  
请问谁仔细能把水纹的图片,文字效果搞定啊包括透明度,求解
12 楼 javantsky 2011-01-11  
tof.j 写道
在xp下使用出现如下异常:
org.im4java.core.CommandException: java.io.FileNotFoundException: convert
	at org.im4java.core.ImageCommand.run(ImageCommand.java:215)
	at com.safetys.safetyw.upload.process.IMProcess.cropImage(IMProcess.java:81)
	at com.safetys.safetyw.upload.process.IMProcess.main(IMProcess.java:86)


问下哥们你安装了GM还是IM,
如果安装了请参考 [url]http://im4java.sourceforge.net/docs/dev-guide.html [/url],里面有讲怎么配置环境的,“Before you begin: Setting up the Environment”。
11 楼 tof.j 2011-01-05  
在xp下使用出现如下异常:
org.im4java.core.CommandException: java.io.FileNotFoundException: convert
	at org.im4java.core.ImageCommand.run(ImageCommand.java:215)
	at com.safetys.safetyw.upload.process.IMProcess.cropImage(IMProcess.java:81)
	at com.safetys.safetyw.upload.process.IMProcess.main(IMProcess.java:86)
10 楼 javantsky 2010-12-07  
sunlightcs 写道
引用
ConvertCmd convert = new ConvertCmd(gm); 



这个gm是什么呢?


IM4JAVA是同时支持ImageMagick和GraphicsMagick的,这里是bool值,如果为true则使用GM,如果为false支持IM。
9 楼 sunlightcs 2010-11-29  
引用
ConvertCmd convert = new ConvertCmd(gm); 



这个gm是什么呢?
8 楼 sun.zhang 2010-09-29  
javantsky 写道
sun.zhang 写道
javantsky 写道
jerryqiu007 写道
加水印的例子有吗

简单做了一个例子,你可以参考下。
                IMOperation op = new IMOperation();		
		
		op.font("Arial").fill("red").draw("text 100,100 www.7dian.com");
		op.addImage();
		op.addImage();
		
		ConvertCmd convert = new ConvertCmd(gm);
		//convert.createScript("d:\\myscript.sh",op);
		convert.run(op, "d:\\test.jpg", "d:\\test2.jpg");



在Linux下面执行命令:
gm convert -font Arial -fill #FFFFFF -pointsize 20 -draw text 0,20 www.hundsun.com /home/tomcat/temp/1s.bmp /home/tomcat/temp/112.bmp

报错:org.im4java.core.CommandException: org.im4java.core.CommandException: gm convert: FreeType library is not available (/usr/share/fonts/default/ghostscript/n019003l.pfb) [没有那个文件或目录].

LZ看是否遇到类似问题???如何解决??谢谢



这个问题应该是你的linux下没有找到“Arial”字体,你找下你的linux都支持哪些字体,选其中一个应该就ok了,或者你去下载你要的字体安装上去也是可以的


字体是存在的,用imageMagick是可以正常执行的,但是graphicsMagick就不行。
另外楼主的程序在Linux下跑过,是正常的,是吧?
能贴一下安装graphicsMagick时执行完./configure后的状态报告吗?我一直在怀疑是不是我安装graphicsMagick有问题,才导致这个问题
7 楼 javantsky 2010-09-28  
sun.zhang 写道
javantsky 写道
jerryqiu007 写道
加水印的例子有吗

简单做了一个例子,你可以参考下。
                IMOperation op = new IMOperation();		
		
		op.font("Arial").fill("red").draw("text 100,100 www.7dian.com");
		op.addImage();
		op.addImage();
		
		ConvertCmd convert = new ConvertCmd(gm);
		//convert.createScript("d:\\myscript.sh",op);
		convert.run(op, "d:\\test.jpg", "d:\\test2.jpg");



在Linux下面执行命令:
gm convert -font Arial -fill #FFFFFF -pointsize 20 -draw text 0,20 www.hundsun.com /home/tomcat/temp/1s.bmp /home/tomcat/temp/112.bmp

报错:org.im4java.core.CommandException: org.im4java.core.CommandException: gm convert: FreeType library is not available (/usr/share/fonts/default/ghostscript/n019003l.pfb) [没有那个文件或目录].

LZ看是否遇到类似问题???如何解决??谢谢



这个问题应该是你的linux下没有找到“Arial”字体,你找下你的linux都支持哪些字体,选其中一个应该就ok了,或者你去下载你要的字体安装上去也是可以的
6 楼 sun.zhang 2010-09-28  
javantsky 写道
jerryqiu007 写道
加水印的例子有吗

简单做了一个例子,你可以参考下。
                IMOperation op = new IMOperation();		
		
		op.font("Arial").fill("red").draw("text 100,100 www.7dian.com");
		op.addImage();
		op.addImage();
		
		ConvertCmd convert = new ConvertCmd(gm);
		//convert.createScript("d:\\myscript.sh",op);
		convert.run(op, "d:\\test.jpg", "d:\\test2.jpg");



在Linux下面执行命令:
gm convert -font Arial -fill #FFFFFF -pointsize 20 -draw text 0,20 www.hundsun.com /home/tomcat/temp/1s.bmp /home/tomcat/temp/112.bmp

报错:org.im4java.core.CommandException: org.im4java.core.CommandException: gm convert: FreeType library is not available (/usr/share/fonts/default/ghostscript/n019003l.pfb) [没有那个文件或目录].

LZ看是否遇到类似问题???如何解决??谢谢

相关推荐

    GraphicsMagick+im4java.pdf

    GraphicsMagick号称图像处理领域的瑞士军刀。 短小精悍的代码却提供了一个鲁棒、高效的工具和库集合...本文档详细的介绍了 GraphicsMagick+im4java的搭建过程,对一些搭建过程中出现的问题进行了详细的解答,避免采坑。

    ChineseWaterMark:IM4JAVA+GraphicsMagick实现中文水印

    3. **处理图片**:通过调用IM4JAVA的`convert`方法,将上述参数转化为GraphicsMagick可执行的命令,然后执行该命令在目标图片上添加水印。 4. **异常处理**:在Java代码中,应该加入适当的错误处理机制,以应对可能...

    Nginx+Lua+GraphicsMagick图片缩略图

    Nginx+Lua+GraphicsMagick实现动态生成指定尺寸的图片

    使用Tengine+Lua+GraphicsMagick实现图片自动裁剪缩放

    "使用Tengine+Lua+GraphicsMagick实现图片...4. 可以flexibly地扩展和定制图片处理的功能 使用Tengine+Lua+GraphicsMagick实现图片自动裁剪缩放是一种高效、灵活和可扩展的解决方案,适用于大量图片加载的网站和应用。

    openresty + lua-resty-weedfs + graphicsmagick小文件部署方案

    将图片的上传,分布式管理 交由seaweedfs管理,可提供更快的响应速度,更方便,无痛的分布式扩展节点,billion 级别的。后面使用openresty + lua-resty-weedfs + graphicsmagick 生成缩略图功能独立处理。

    缩略图OpenResty(Nginx)+Lua+GraphicsMagick

    GraphicsMagick是一个跨平台的图像处理工具,它支持大量的图像格式,并提供了丰富的API用于创建、编辑和转换图像。在OpenResty环境中,我们可以通过Lua调用GraphicsMagick的命令行接口,进行缩略图的生成、裁剪、...

    Tengine+Lua+GraphicsMagick实现图片自动伸缩功能(ubuntu版).rar

    总结起来,"Tengine+Lua+GraphicsMagick实现图片自动伸缩功能(ubuntu版)"提供了一种高效且灵活的图片处理方案,适用于需要处理大量图片的网站,有助于提升用户体验和服务器性能。通过学习和应用这种技术,开发者可以...

    nginx-lua-GraphicsMagick

    **Nginx-Lua-GraphicsMagick:搭建高效图片处理服务** 在当今互联网时代,图片是网站内容的重要组成部分,无论是社交媒体、电子商务还是个人博客,都需要处理大量的图片。为了提高图片处理效率并减轻服务器负担,...

    im4java-1.4.0.jar

    im4java-1.4.0.jar,用于ImagineMagick和GraphicsMagick

    GraphicsMagick

    GraphicsMagick在这些领域中占据一席之地,它的应用不仅限于简单的照片编辑,还可以应用于科学可视化、数据可视化、网站开发、移动应用、服务器端图像处理等多个行业。 "gm"可能是压缩包内的主要程序或者脚本文件,...

    使用GraphicsMagick处理图片含Demo

    4. **图片处理**:除了上述功能,GraphicsMagick还提供了丰富的图像处理功能,如调整尺寸、裁剪、旋转、模糊等。例如,缩小图片尺寸: ``` gm convert original.jpg -resize 50% resized.jpg ``` 接下来,我们来...

    GraphicsMagick安装包

    在实际应用中,你可以根据需求使用GraphicsMagick和im4java进行复杂的图像处理操作,例如批量转换、添加水印、调整图像质量等。了解GraphicsMagick的命令行选项和im4java的API是充分发挥它们潜力的关键。

    GraphicsMagick-1.3.12-Q16-windows-dll.exe

    对于Java开发者来说,常用的图片处理工具有3个,JDK自带的图片处理库,ImageMagick,GraphicsMagick。JDK自带的图片处理库,虽稳定简单,性能却比较差;ImageMagick是目前最流行的图片处理工具,它的功能非常丰富;...

    Docker+FastDFS+Nginx+Lua搭建图片服务器,并实现图片缩略图

    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图片截取软件全套及相应的demo.rar

    GraphicsMagick是一款强大的开源图像处理工具,它支持多种图片格式,并提供了丰富的命令行接口来执行各种图像操作,如转换、裁剪、缩放、旋转、颜色调整等。在这个"GraphicsMagick图片截取软件全套及相应的demo.rar...

    GraphicsMagick图像处理

    GraphicsMagick能够动态的生成图片,特别适用于互联网的应用。可以用来处理调整尺寸、旋转、加亮、颜色调整、增加特效等方面。GaphicsMagick不仅支持命令行的模式,同时也支持C、C++、Perl、PHP、Tcl、 Ruby等的调用

    GraphicsMagick 图片工具-图片处理

    GraphicsMagick 是一个用来读写、生成超过 90 种图像格式的工具集合,可以对图片进行格式参数处理,支持包括 TIFF, JPEG, JPEG-2000,PNG, PDF, PhotoCD, SVG, 和 GIF 等图像格式。GraphicsMagick 是基于 ImageMagick...

    GraphicsMagick图片库GraphicsMagick-1.3.26.tar.xz

    GraphicsMagick图片库GraphicsMagick-1.3.26.tar.xz Java图片处理 - 安装ImageMagick库使用convert命令 - 文章中的辅助文件 http://blog.csdn.net/chwshuang/article/details/64921665

    GraphicsMagick-1.3.40安装包

    GraphicsMagick是一款强大的开源图像处理工具,用于读取、转换和写入多种图像格式。它提供了命令行界面,使得在各种脚本环境中处理图像变得简单。这个安装包是GraphicsMagick的1.3.40版本,包含了适用于不同操作系统...

Global site tag (gtag.js) - Google Analytics