`
zhaohaolin
  • 浏览: 1004192 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JMagick+ ImageMagick

    博客分类:
  • JAVA
阅读更多

作者: 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

分享到:
评论

相关推荐

    ImageMagick-6.3.9+jmagick组合

    ImageMagick是一款强大的开源图像处理工具,而JMagick是其与Java平台的桥梁,使得在Java应用程序中能够调用ImageMagick的功能。这个“ImageMagick-6.3.9+jmagick组合”指的是ImageMagick的一个特定版本6.3.9与...

    jmagick.zip

    《JMagick与ImageMagick在Java环境中的应用》 JMagick与ImageMagick是两个在图像处理领域中广泛使用的开源库,尤其在Java环境中,它们为开发者提供了强大的图像处理功能。本文将深入探讨这两个工具的核心概念、功能...

    jmagick-win-5.5.7-Q8.zip

    "jmagick-win-5.5.7-Q8.zip"这个压缩包中包含了在Windows环境下运行JMagick所需的所有组件,包括核心库文件"jmagick.dll"、Java类库文件"jmagick.jar"以及ImageMagick的安装程序"ImageMagick-5.5.7-Q8-windows-dll....

    linux下安装ImageMagick-6.5+JMagick -6.4 经测试成功的

    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

    标题中的"jmagick-6.2.4-1-IM-6.2.5.jar"和"ImageMagick-6.2.5-4-Q16-windows-dll.exe"分别指的是JavaMagick库和ImageMagick软件的不同版本。这两个组件在IT领域中扮演着重要的角色,特别是对于图像处理和转换。 **...

    ImageMagick使用手册

    JMagick是ImageMagick的一个Java绑定,它允许Java应用程序直接利用ImageMagick的功能。在Windows环境下,安装JMagick需要以下几个步骤: 1. 首先,你需要下载并安装ImageMagick。你可以从官方网站`...

    64位Linux安装ImageMagick

    在64位Linux环境下安装ImageMagick,特别是与JMagick配合使用,是一个涉及多个步骤的过程,主要目的是为了实现Java应用程序对ImageMagick图像处理功能的调用。以下是详细的安装步骤和相关知识点: 1. **卸载旧版本*...

    Jmagick32位的和Jmagick64位的Jmagick.dll,Jmagick.jar

    Jmagick是一款将ImageMagick图像处理库与Java平台相结合的扩展库,它允许Java开发者利用强大的ImageMagick功能来处理图像。在Java应用程序中,Jmagick通过Jmagick.dll动态链接库和Jmagick.jar文件提供对底层C++接口...

    jmagick 用法

    JMagick 是一个 Java 的图像处理库,它提供了对 ImageMagick 图像处理库的 Java 接口。ImageMagick 是一个强大的跨平台命令行工具集,用于读取、转换和写入多种格式的图像。通过 JMagick,Java 开发者可以方便地在...

    jmagick 软件、安装说明(window和linux两个版本)

    - **Java接口**: JMagick是ImageMagick与Java之间的桥梁,提供了一系列Java类和方法,使得开发者可以利用Java代码调用ImageMagick的底层功能。 - **ImageMagick**: 是一个开源的命令行工具集,用于在各种操作系统上...

    jmagick安装和配置

    JMagick是一款强大的Java接口,它允许Java应用程序与ImageMagick图像处理库进行交互,从而实现丰富的图像操作功能。本文将详细介绍如何在Java环境中安装和配置JMagick,以及如何使用提供的示例进行测试。 ### 1. ...

    jmagick6.4.0

    **JMagick 6.4.0:Java与ImageMagick的强大结合** JMagick是ImageMagick图像处理库的一个Java接口,它为Java开发者提供了一种高效且灵活的方式来处理和操作图像。ImageMagick是一个功能丰富的开源跨平台工具集,...

    jmagick-win-6.3.9

    JMagick是ImageMagick的一个Java绑定,ImageMagick是一款强大的跨平台图像处理软件,支持超过100种不同的图像格式。通过JMagick,Java开发者可以直接在Java代码中调用ImageMagick的函数,进行图像的创建、编辑、合成...

    jmagick-win-6.3.9-Q16

    JMagick是ImageMagick的一个Java接口,ImageMagick是一款开源的跨平台图像处理工具,支持超过100种不同的图像文件格式。通过JMagick,Java开发者可以利用ImageMagick的强大功能,无需离开Java环境。它提供了一系列的...

    ImageMagick

    下载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.jar 用法

    JMagick 是一个 Java 包装器库,它提供了对 ImageMagick 图像处理库的访问。ImageMagick 是一个功能强大的跨平台图像处理工具,而 JMagick 则是将这些功能引入 Java 应用程序的桥梁。通过 JMagick,Java 开发者可以...

    jmagick-6.2.4-1-IM-6.2.5.zip

    标题中的"jmagick-6.2.4-1-IM-6.2.5.zip"指的是JMagick的一个特定版本,这是一个Java绑定的ImageMagick库,用于处理图像操作和转换。ImageMagick是一个开源的跨平台命令行工具集,广泛用于在各种文件格式之间进行...

    jmagick 例子

    JMagick是Java接口到ImageMagick的一个扩展,ImageMagick是一款强大的跨平台命令行工具,用于转换、编辑和合成图像。通过JMagick,Java开发者能够利用ImageMagick的丰富功能,如图像的放大、缩小、旋转、裁剪、颜色...

    ImageMagick安装支持heic格式.docx

    在Java环境中,可以使用JavaMagick或JMagick这样的Java绑定库,它们提供了与ImageMagick交互的API,使得在Java代码中调用ImageMagick的功能变得简单。首先,确保正确配置了这些库的依赖,并按照ImageMagick的命令行...

    Jmagick缩图 JAVA图片处理

    JMagick是ImageMagick的一个Java接口,ImageMagick是一个强大的跨平台图像处理库。它允许Java开发者利用ImageMagick的强大功能,如转换、编辑和合成图像,而无需了解底层C++代码。JMagick提供了丰富的API,可以处理...

Global site tag (gtag.js) - Google Analytics