MacOX安装JMgick原因和使用JMagick执行流程
目前对于图片处理,很少采用java去处理图片,性能不是很好。目前我们公司采用ImageMagick图片处理,有些采用Process执行cmd命令,有些采用jmagick的java接口进行处理。
ImageMagick官网
通过jmagick调用native方法来调用JMagick的方法, 再由JMagick调用ImageMagick的方法。jmagick使用Java代码写的。JMagick使用C语言写的,含有java JNI生成的头文件。ImageMagick使用C语言写的,没有含有java JNI生成的头文件。 ImageMagick介绍和执行流程原因解释
- 执行流程:
- jmagick(java) –> JMagick(C) –> ImageMagick(C)
本地MacOX执行遇到问题
new MagickInfo(“”); 调用时出现无法加载MagickLoader,实际无法加载资源JMagick;
1 | ClassLoader.getSystemClassLoader().loadClass("magick.MagickLoader").newInstance(); |
因为jmagick的接口都是本地调用,需要加载JNI的JMagick动态库。因此,接下来我们的主要任务是生成JMagick的动态库。
通过Brew install ImageMagick直接安装使用。但是JMagick只用源码包,需要进行编译安装。尽量将ImageMagick和JMagick安装在同一路径下。
Brew install ImageMagick,开始编译JMagick,生成JMagick动态库。
- 遇到JMagick出现找不到api.h文件(实际上在ImageMagick-7是没有这个api.h文件,在ImageMagick-6是有api.h文件):
checking magick/api.h usability… no
checking magick/api.h presence… no
checking for magick/api.h… no
configure: error: ‘Unable to find ImageMagick header files’。
出现这种情况通过pkg-config、修改configure的参数、查看configure源码,根据报错来修改文件路径,让其能够找到header files等等方法。这些方法都没有解决问题。
主要是因为JMagick版本老(最新版本是2013更新的),无法跟上ImageMagick的节奏。ImageMagick的文件位置都发生了很大的变化。(注.看configure源码,可以看到一些文件路径不在了)。
我们需要做的是:ImageMagick不要安装最新版本,安装旧版ImageMaick6相关版本,并且下载JMagick6.4.0版本。
根据configure的部分源码
1 | # Check whether --with-magick-home was given. |
因为编译的该文件的${MPATH}/include/magick/api.h
。由于目前include路径下存放的文件多了一层Imagemagick-6,我们要将Imagemagick-6里的所有文件ln -s到include目录下。
eg:我的configure命令:
JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/" CFLAGS="-I/Library/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/Contents/Home/include/ -I/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/include/darwin" ./configure --with-magick-inc-dir=-I/usr/local/Cellar/imagemagick/6.9.10-14/include/ --with-magick-lib-dir=-L/usr/local/Cellar/imagemagick/6.9.10-14/lib/
./configure --with-java-home=
/usr/libexec/java_home--with-java-includes=/System/Library/Frameworks/JavaVM.framework/Headers --with-magick-inc-dir=/usr/local/Cellar/imagemagick@6/6.9.10-14/include/ --with-magick-lib-dir=/usr/local/Cellar/imagemagick@6/6.9.10-14/lib/
接下来有些问题下面链接可以解决一部分由
Mac OS X 安装JMagick来解决我们configure的问题。
因为还有编译文件中的withval=$with_magick_home; MAGICK_HOME=${withval}
,因此我们可以通过增加 – with_magick_home参数,解决某些问题。
make过程中ERROR :
1 | make[1]: Entering directory `/usr/local/Cellar/jmagick-6.4.0/6.4.0/src' |
因为api.h的路径不对,可以通过ln -s 下。eg: cd /usr/local/Cellar/ && ln -s ./imagemagick@6/ imagemagick
1 | make[1]: Entering directory `/Users/yibo/Downloads/6.4.0/src' |
修改Make.rules, 175,176 四个空格换成tab,参见: http://stackoverflow.com/a/15880079/3368344
make make install 成功之后
在/usr/local/lib会生成三个文件
- jmagick-6.4.0.jar
- libJMagick-6.4.0.so
- libJMagick.so -> ./libJMagick-6.4.0.so
在动态链接库在不同平台的形式: - windows .dll
- linux .so
- macos .dylib (最新的动态链接库) .jnilib (以前的动态链接库)
需要在mac上使用动态链接库,需要使用dylib的后缀的名称。
cp libJMagick.so libJMagick.dylib
测试使用
IDEA的单元测试没有问题
1 | try { |
IDEA的Tomcat需要额外处理:
tomcat的VM options增加:
-Djmagick.systemclassloader=no -Djava.library.path=/usr/local/lib
参考资料:
Mac OS X 安装JMagick
Mac安装Imagemagick和JMagick
Linux的pkg-config命令
ImageMagick +Jmagick安装