GraphicsMagick+IM4Java在项目中的使用总结

一)前言:
服务器端图片上传逻辑改版,将文件自己压缩成3份然后上传至某云进行存储。
选择GraphicsMagick+IM4Java,放弃并发能力弱的ImageMagick+Jmagick。
网上可供学习GraphicsMagick与IM4Java的资料是在太少,翻来覆去就那么几篇,碰到异常只能一遍又一遍的研读官方文档!这也是我写这篇文章的原因之一。

im4java参考资料:

1)请详见Developer's Guide: http://im4java.sourceforge.net/docs/dev-guide.html

2)github上im4java的源码:https://github.com/Widen/im4java

GraphicsMagick参考资料:

1)http://www.graphicsmagick.org   

先在本地安装使用测试,觉得性能还OK的话,再放到测试服务器上部署测试实际性能。本地环境是win,win下的GM(GraphicsMagick)就很好安装了,与普通软件安装无异。

二)使用IM4Java:

瞧Developer's Guide中的“Before you begin: Setting up the Environment”内容,大意是使用之前先设置工具的工具(当然压缩图片的工具,名字叫gm)的搜索路径,并说明了这几种设置方式的差别。

比如win下的安装路径,假如我安装的路径是D:GraphicsMagick-1.3.19-Q16,则代码为:

String myPath="D:\GraphicsMagick-1.3.19-Q16";

ProcessStarter.setGlobalSearchPath(myPath);   

注:我们不能在linux服务器中这么写代码,linux直接就设置环境变量:export PATH=$PATH:/abc...,其中/abc是你的GM工具所在路径,比如我的是/home/db/roderickyu/soft/bin

简单用法就直接看文档吧,我这里写几个文档里不太容易读出来的内容:

压缩时可以直接添加本地的图片,比如:
IMOperation op = new IMOperation();
op.addImage("D:\test.jpg");     // 输入要压缩的文件路径
op.resize(640);                  // 多番尝试后才知道这是限定width,height等比缩放
op.addImage("D:\newTest.jpg");  // 压缩后的文件的输出路径,当然可以没有扩展名!

还有一种是对输入流进行压缩,比如官方文档中:
IMOperation op = new IMOperation();
op.addImage("-");                   // read from stdin
op.addImage("tif:-");               // write to stdout in tif-format
代码中tif是指按照tif格式进行压缩,但是变化不明显(而且压缩后的大小与size大小不成正比),很容易给初学者造成是不是代码不好使的挫败感!将tif换成jpg压缩的大小变化就明显了。这是一个坑!

回到这个需求来,我们只有一个输入流,怎么把这个输入流压缩成3份大小不等的文件呢?
将输入流转化成byte数组,就不存在流被第一个文件读完第二三的文件没有流可以读时报异常。。。empty input file...
代码为:
InputStream fileStream = ......
int total = fileStream.available();
byte[] bs = new byte[total];
fileStream.read(bs);

按照GM的官方文档安装GM时失败,后才得解:安装路径不是当前linux用户的可读写权限内的路径,换成当前身份可读写的路径呗或者换登入身份呗~

最后测试,发现性能相当优异!

原文地址:https://www.cnblogs.com/xu-thinking/p/3660779.html