- 浏览: 1011243 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (826)
- 硬件 (8)
- 软件 (24)
- 软件工程 (34)
- JAVA (229)
- C/C++/C# (77)
- JavaScript (8)
- PHP (1)
- Ruby (3)
- MySQL (14)
- 数据库 (19)
- 心情记事 (12)
- 团队管理 (19)
- Hadoop (1)
- spring (22)
- mybatis(ibatis) (7)
- tomcat (16)
- velocity (0)
- 系统架构 (6)
- JMX (8)
- proxool (1)
- 开发工具 (16)
- python (10)
- JVM (27)
- servlet (5)
- JMS (26)
- ant (2)
- 设计模式 (5)
- 智力题 (2)
- 面试题收集 (1)
- 孙子兵法 (16)
- 测试 (1)
- 数据结构 (7)
- 算法 (22)
- Android (11)
- 汽车驾驶 (1)
- lucene (1)
- memcache (12)
- 技术架构 (7)
- OTP-Erlang (7)
- memcached (17)
- redis (20)
- 浏览器插件 (3)
- sqlite (3)
- Heritrix (9)
- Java线程 (1)
- scala (0)
- Mina (6)
- 汇编 (2)
- Netty (15)
- libevent (0)
- CentOS (12)
- mongod (5)
- mac os (0)
最新评论
-
kingasdfg:
你这里面存在一个错误添加多个任务 应该是这样的 /** * ...
Quartz的任务的临时启动和暂停和恢复【转】 -
kyzeng:
纠正一个错误,long型对应的符号是J,不是L。
Jni中C++和Java的参数传递 -
zhaohaolin:
抱歉,兄弟,只是留下作记录,方便学习,如果觉得资料不好,可以到 ...
netty的个人使用心得【转】 -
cccoooccooco:
谢谢!自己一直以为虚机得使用网线才可以与主机连接呢。。
主机网卡无网线连接与虚拟机通信 -
yuqilin001:
要转别人的东西,请转清楚点嘛,少了这么多类,误人子弟
netty的个人使用心得【转】
作者: jiangyuntc 时间: 2011-2-24 09:01 标题: JMagick+ ImageMagick
做网站往往需要处理各种各样的图片,对于jdk自带的一套图片处理库,他的特点是稳定简单,但是对图片处理来说,性能确实很不咋的!
于是我转向了以C++处理为核心的java处理包—— JMagick+ ImageMagick 。jmagick是一个开源的API,利用JNI(Java Native Interface)技术实现了对ImageMagickAPI 的Java访问接口,因此也将比纯Java实现的图片操作函数在速度上要快。实地测试后发现,速度果然提高了不少,但是质量却大大下降了,在大量测试数据下,每生成100张图片约会有5张图片生成出现错误,还会出现down机的情况。对于一个商业应用来说,这个是绝对不可以接受的,于是对jmagick的研究暂放一段时间。
经过韩boss指导,我转向了 GraphicsMagick+im4java 的研究,输入关键词google一下,很容易就可以找到http://javantsky.javaeye.com/blog/747807 ,这篇博客,文章介绍GraphicsMagick+im4java 性能高,运行稳定!
于是我开始了对GraphicsMagick+im4java实际研究:
个人感觉im4java就是graphicsmagick的外面包装了一层“纸”,一个java转换的命令行输出工具,其api也基本没有参考价值(有些与实际不符的地方),GraphicsMagick+im4java的核心在于GraphicsMagick。
作为一个缩放+切割功能的实现,可以使用
命令行代码
gm convert input.jpg -thumbnail 100x100^ -gravity center -extent 100x100 output.jpg
命令行代码
gm convert input.jpg -thumbnail 100x100^ -gravity center -extent 100x100 output.jpg
gm convert input.jpg -thumbnail 100x100^ -gravity center -extent 100x100 output.jpg
这条命令,经过测试发现,thumbnail命令的效率还不如原有java实现的效率,可能用它来实现这么简单的功能是高射炮打蚊子了,关于GraphicsMagick各项参数的使用的文章,网上实在是少之又少,于是只能靠自己了!
我找到了所有和缩放有关的命令,经过一一验证,最终选择了sample命令。相比最初的纯java实现,内存节省了约70%,CPU效率提高了约80%,耗费时间约节省了72%,下面为我找到的所有缩放有关的GraphicsMagick命令的测试数据:
Graphics+im4java性能对比:
记录一(其中内存和CPU为观测数据):
原有java实现:
图片大小:2.5M(2592x1944)
内存:1185M(共)
CPU:170%(共)(按双核)
耗时:162,875ms/200张(线程池10)
输出图片大小:36.1K
thumbnail命令实现:
命令行代码
gm convert input.jpg -thumbnail 600x600^ -gravity center -extent 600x600 output.jpg
命令行代码
gm convert input.jpg -thumbnail 600x600^ -gravity center -extent 600x600 output.jpg
gm convert input.jpg -thumbnail 600x600^ -gravity center -extent 600x600 output.jpg
图片大小:2.5M(2592x1944)
内存:150M/线程
CPU:9%/线程
耗时:193,423ms/200张(线程池10)
输出图片大小:78.5K
geometry命令实现:
命令行代码
gm convert input.jpg -geometry 600x600^ -gravity center -extent 600x600 output.jpg
命令行代码
gm convert input.jpg -geometry 600x600^ -gravity center -extent 600x600 output.jpg
gm convert input.jpg -geometry 600x600^ -gravity center -extent 600x600 output.jpg
图片大小:2.5M(2592x1944)
内存:50M/线程
CPU:9%/线程
耗时:94,518ms/200张(线程池10)
输出图片大小:101.8K
resize命令实现:
命令行代码
gm convert input.jpg -resize 600x600^ -gravity center -extent 600x600 output.jpg
命令行代码
gm convert input.jpg -resize 600x600^ -gravity center -extent 600x600 output.jpg
gm convert input.jpg -resize 600x600^ -gravity center -extent 600x600 output.jpg
图片大小:2.5M(2592x1944)
内存:55M/线程
CPU:13%/线程
耗时:97,342ms/200张(线程池10)
输出图片大小:101.8K
sample命令实现:
命令行代码
gm convert input.jpg -sample 600x600^ -gravity center -extent 600x600 output.jpg
命令行代码
gm convert input.jpg -sample 600x600^ -gravity center -extent 600x600 output.jpg
gm convert input.jpg -sample 600x600^ -gravity center -extent 600x600 output.jpg
图片大小:2.5M(2592x1944)
内存:35M/线程
CPU:9%/线程
耗时:46,541ms/200张(线程池10)
输出图片大小:117.3K
sample(quality:50)
命令行代码
gm convert input.jpg -sample 600x600^ -gravity center -extent 600x600 -quality 50 output.jpg
命令行代码
gm convert input.jpg -sample 600x600^ -gravity center -extent 600x600 -quality 50 output.jpg
gm convert input.jpg -sample 600x600^ -gravity center -extent 600x600 -quality 50 output.jpg
图片大小:2.5M(2592x1944)
内存:40M/线程
CPU:16%/线程
耗时:68,839ms/200张(线程池10)
输出图片大小:47.2
scale命令实现:
命令行代码
gm convert input.jpg -scale 600x600^ -gravity center -extent 600x600 output.jpg
命令行代码
gm convert input.jpg -scale 600x600^ -gravity center -extent 600x600 output.jpg
gm convert input.jpg -scale 600x600^ -gravity center -extent 600x600 output.jpg
图片大小:2.5M(2592x1944)
内存:42M/线程
CPU:8%/线程
耗时:68,778ms/200张(线程池10)
输出图片大小:99.2K
在sample命令下,可以通过修改quality参数的值,来修改输出图片质量,改变输出图片大小。以下为我的测试数据:
记录二:
sample对比(无quality设置):
图片大小:2.5M(2592x1944)
内存:32(\)M/线程
CPU:9%/线程
耗时:46,659ms/200张(线程池10)
输出图片大小:117.3K
sample(quality:50)
图片大小:2.5M(2592x1944)
内存:28M/线程
CPU:9%/线程
耗时:40,549ms/200张(线程池10)
输出图片大小:48.8
sample(quality:60)
图片大小:2.5M(2592x1944)
内存:35M(\)/线程
CPU:8%(\)/线程
耗时:45,647ms/200张(线程池10)
输出图片大小:53.3
sample(quality:75)
图片大小:2.5M(2592x1944)
内存:30M(\)/线程
CPU:9%(\)/线程
耗时:45,719ms/200张(线程池10)
输出图片大小:65.6
sample(quality:85)
图片大小:2.5M(2592x1944)
内存:32M(\)/线程
CPU:8%(\)/线程
耗时:46,510ms/200张(线程池10)
输出图片大小:84.5
sample(quality:95)
图片大小:2.5M(2592x1944)
内存:34M(\)/线程
CPU:8%(\)/线程
耗时:47,650ms/200张(线程池10)
输出图片大小:156.0
sample(quality:100)
图片大小:2.5M(2592x1944)
内存:34M(\)/线程
CPU:11%(\)/线程
耗时:50,469ms/200张(线程池10)
输出图片大小:298.1
Java实现代码
ConvertCmd cvcmd = new ConvertCmd();
Operation op = new Operation();
op.addImage();
op.addRawArgs("-sample" , "600x600^" );
op.addRawArgs("-gravity" , "center" );
op.addRawArgs("-extent" , "600x600" );
op.addRawArgs("-quality" , "100" );
op.addImage();
cvcmd.run(op, srcImg, desImg);
Java实现代码
ConvertCmd cvcmd = new ConvertCmd();
Operation op = new Operation();
op.addImage();
op.addRawArgs("-sample", "600x600^");
op.addRawArgs("-gravity", "center");
op.addRawArgs("-extent", "600x600");
op.addRawArgs("-quality", "100");
op.addImage();
cvcmd.run(op, srcImg, desImg);
ConvertCmd cvcmd = new ConvertCmd();
Operation op = new Operation();
op.addImage();
op.addRawArgs("-sample", "600x600^");
op.addRawArgs("-gravity", "center");
op.addRawArgs("-extent", "600x600");
op.addRawArgs("-quality", "100");
op.addImage();
cvcmd.run(op, srcImg, desImg); 这是我从文小猫童鞋那里找到的一张她自制的美食图片,源图像文件像素为1944x2592,处理后为600x600;
由于个人能力有限,欢迎大家指出不足,提出更好的解决方案!
im4java官方网站:
http://im4java.sourceforge.net/index.html
im4java的api:
http://im4java.sourceforge.net/api/
graphicsmagick的官方网站:
http://www.graphicsmagick.org/index.html
graphicsmagick的命令行参数解析:
http://www.graphicsmagick.org/utilities.html
发表评论
-
调试jdk中的源码,查看jdk局部变量
2013-06-15 23:30 1048调试jdk中的源码,查看jdk局部变量 2012-04 ... -
Eclipse快捷键 10个最有用的快捷键<转>
2013-04-11 23:28 1070Eclipse中10个最有用的快捷键组合 一个Eclip ... -
Lucene 3.6 中文分词、分页查询、高亮显示等
2012-12-09 23:35 18101、准备工作 下载lucene 3.6.1 : htt ... -
Maven实战(九)——打包的技巧(转)
2012-10-12 00:41 932“打包“这个词听起 ... -
基于Maven的web工程如何配置嵌入式Jetty Server开发调试环境(转)
2012-10-12 00:28 9161、首先在web工程的POM文件里添加依赖jar包如下: ... -
轻轻松松学Solr(1)--概述及安装[转]
2012-09-18 14:59 990概述 这段时间对企 ... -
分析Netty工作流程[转]
2012-09-04 19:02 883下面以Netty中Echo的例 ... -
让eclipse在ubuntu下面好看一点
2012-03-27 10:17 914<p> </p> <h1 cla ... -
zookeeper安装和应用场合(名字,配置,锁,队列,集群管理)[转]
2012-01-12 17:59 1647安装和配置详解 本文 ... -
Jakarta-Common-BeanUtils使用笔记[转]
2012-01-10 14:13 1153Jakarta-Common-BeanUtils ... -
一个关于Java Thread wait(),notify()的实用例【转】
2012-01-07 16:05 1019///// // ProducerConsume ... -
Java基础:Java中的 assert 关键字解析【转】
2012-01-06 19:50 1056J2SE 1.4在语言上提供了 ... -
一篇不错的讲解Java异常的文章(转载)----感觉很不错,读了以后很有启发[转]
2012-01-06 15:02 1259六种异常处理的陋习 ... -
如何解决HP QC(Quality Center)在Windows 7下不能工作的问题
2011-12-26 10:48 1574HP QC(Quantity Center) 是一款不错的测 ... -
JAVA读写文件,中文乱码 【转】
2011-12-19 23:43 2115最近在做HTML静态生成,需要从硬盘上把模版文件的内容读出来。 ... -
Java 6 JVM参数选项大全(中文版)【转】
2011-12-19 19:51 966Java 6 JVM参数选项大全(中文版) 作者 ... -
使用assembly plugin实现自定义打包【转】
2011-12-13 01:58 965在上一篇文章中,讨论到在对maven的机制不熟悉的情况下,为了 ... -
使用maven ant task实现非标准打包[转]
2011-12-13 01:56 1045maven很强大,但是总有些事情干起来不是得心应手,没有使用a ... -
Java日期转换SimpleDateFormat格式大全【转】
2011-12-08 20:22 130924小时制时间 显示: public clas ... -
使用Spring的表单标签库
2011-11-22 20:08 106713.9. 使用Spring的 ...
相关推荐
ImageMagick是一款强大的开源图像处理工具,而JMagick是其与Java平台的桥梁,使得在Java应用程序中能够调用ImageMagick的功能。这个“ImageMagick-6.3.9+jmagick组合”指的是ImageMagick的一个特定版本6.3.9与...
《JMagick与ImageMagick在Java环境中的应用》 JMagick与ImageMagick是两个在图像处理领域中广泛使用的开源库,尤其在Java环境中,它们为开发者提供了强大的图像处理功能。本文将深入探讨这两个工具的核心概念、功能...
"jmagick-win-5.5.7-Q8.zip"这个压缩包中包含了在Windows环境下运行JMagick所需的所有组件,包括核心库文件"jmagick.dll"、Java类库文件"jmagick.jar"以及ImageMagick的安装程序"ImageMagick-5.5.7-Q8-windows-dll....
Jmagick包中的Changelog.txt中有ImageMagick与JMagick版本对应的关系的说明 ) 安装说明: ================================== cd /usr/bin/ rm java rm javac ln -s /usr/java/jdk6/bin/java java ln -s /usr/java/...
标题中的"jmagick-6.2.4-1-IM-6.2.5.jar"和"ImageMagick-6.2.5-4-Q16-windows-dll.exe"分别指的是JavaMagick库和ImageMagick软件的不同版本。这两个组件在IT领域中扮演着重要的角色,特别是对于图像处理和转换。 **...
Jmagick是一款将ImageMagick图像处理库与Java平台相结合的扩展库,它允许Java开发者利用强大的ImageMagick功能来处理图像。在Java应用程序中,Jmagick通过Jmagick.dll动态链接库和Jmagick.jar文件提供对底层C++接口...
JMagick是ImageMagick的一个Java绑定,它允许Java应用程序直接利用ImageMagick的功能。在Windows环境下,安装JMagick需要以下几个步骤: 1. 首先,你需要下载并安装ImageMagick。你可以从官方网站`...
在64位Linux环境下安装ImageMagick,特别是与JMagick配合使用,是一个涉及多个步骤的过程,主要目的是为了实现Java应用程序对ImageMagick图像处理功能的调用。以下是详细的安装步骤和相关知识点: 1. **卸载旧版本*...
JMagick 是一个 Java 的图像处理库,它提供了对 ImageMagick 图像处理库的 Java 接口。ImageMagick 是一个强大的跨平台命令行工具集,用于读取、转换和写入多种格式的图像。通过 JMagick,Java 开发者可以方便地在...
- **Java接口**: JMagick是ImageMagick与Java之间的桥梁,提供了一系列Java类和方法,使得开发者可以利用Java代码调用ImageMagick的底层功能。 - **ImageMagick**: 是一个开源的命令行工具集,用于在各种操作系统上...
JMagick是一款强大的Java接口,它允许Java应用程序与ImageMagick图像处理库进行交互,从而实现丰富的图像操作功能。本文将详细介绍如何在Java环境中安装和配置JMagick,以及如何使用提供的示例进行测试。 ### 1. ...
**JMagick 6.4.0:Java与ImageMagick的强大结合** JMagick是ImageMagick图像处理库的一个Java接口,它为Java开发者提供了一种高效且灵活的方式来处理和操作图像。ImageMagick是一个功能丰富的开源跨平台工具集,...
JMagick是ImageMagick的一个Java绑定,ImageMagick是一款强大的跨平台图像处理软件,支持超过100种不同的图像格式。通过JMagick,Java开发者可以直接在Java代码中调用ImageMagick的函数,进行图像的创建、编辑、合成...
JMagick是ImageMagick的一个Java接口,ImageMagick是一款开源的跨平台图像处理工具,支持超过100种不同的图像文件格式。通过JMagick,Java开发者可以利用ImageMagick的强大功能,无需离开Java环境。它提供了一系列的...
下载ImageMagick-6.3.9-0-Q8-windows-dll.exe和jmagick-win-6.3.9-Q8.zip 安装ImageMagick-6.3.9-0-Q8-windows-dll.exe,按照网上说法把安装后根目录下的所有.dll文件拷贝到C:\WINDOWS\system32下。不过没拷贝成功。...
JMagick 是一个 Java 包装器库,它提供了对 ImageMagick 图像处理库的访问。ImageMagick 是一个功能强大的跨平台图像处理工具,而 JMagick 则是将这些功能引入 Java 应用程序的桥梁。通过 JMagick,Java 开发者可以...
JMagick是Java接口到ImageMagick的一个扩展,ImageMagick是一款强大的跨平台命令行工具,用于转换、编辑和合成图像。通过JMagick,Java开发者能够利用ImageMagick的丰富功能,如图像的放大、缩小、旋转、裁剪、颜色...
在Java环境中,可以使用JavaMagick或JMagick这样的Java绑定库,它们提供了与ImageMagick交互的API,使得在Java代码中调用ImageMagick的功能变得简单。首先,确保正确配置了这些库的依赖,并按照ImageMagick的命令行...
JMagick是ImageMagick的一个Java接口,ImageMagick是一个强大的跨平台图像处理库。它允许Java开发者利用ImageMagick的强大功能,如转换、编辑和合成图像,而无需了解底层C++代码。JMagick提供了丰富的API,可以处理...
标题中的"jmagick-6.2.4-1-IM-6.2.5.zip"指的是JMagick的一个特定版本,这是一个Java绑定的ImageMagick库,用于处理图像操作和转换。ImageMagick是一个开源的跨平台命令行工具集,广泛用于在各种文件格式之间进行...