MacOX安装JMagick、Jmagick安装学习、Jmagick爬坑指南

吐槽、建议、解惑入口网址

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
2
3
4
5
6
ClassLoader.getSystemClassLoader().loadClass("magick.MagickLoader").newInstance();
public class MagickLoader {
static {
System.loadLibrary("JMagick");
}
}

因为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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Check whether --with-magick-home was given.
if test "${with_magick_home+set}" = set; then
withval=$with_magick_home; MAGICK_HOME=${withval}
fi

for MPATH in /usr /usr/local /usr/local/ImageMagick /usr/local/ImageMagick-${VER_MAJOR}.${VER_MINOR}.${VER_MICRO} ${MAGICK_HOME} ; do
# Location before IM 6.3.8.something
if test -f ${MPATH}/include/magick/api.h ; then
MAGICK_LIB_PATH=${MPATH}/lib
MAGICK_LIBS="-L${MPATH}/lib -lMagick"
MAGICK_INCLUDES=-I${MPATH}/include
MAGICK_REALHOME=${MPATH}
fi
# Location after IM 6.3.8.something
if test -f ${MPATH}/include/ImageMagick/magick/api.h ; then
MAGICK_LIB_PATH=${MPATH}/lib
MAGICK_LIBS="-L${MPATH}/lib -lMagick"
MAGICK_INCLUDES=-I${MPATH}/include/ImageMagick
MAGICK_REALHOME=${MPATH}
fi
done

因为编译的该文件的${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
2
3
4
5
6
7
make[1]: Entering directory `/usr/local/Cellar/jmagick-6.4.0/6.4.0/src'
make[2]: Entering directory `/usr/local/Cellar/jmagick-6.4.0/6.4.0/src/magick'
make[2]: *** No rule to make target `/usr/local/Cellar/imagemagick/6.9.10-14/include/magick/api.h', needed by `/usr/local/Cellar/jmagick-6.4.0/6.4.0/obj/magick/magick_PixelPacket.lo'. Stop.
make[2]: Leaving directory `/usr/local/Cellar/jmagick-6.4.0/6.4.0/src/magick'
make[1]: *** [dir_target] Error 2
make[1]: Leaving directory `/usr/local/Cellar/jmagick-6.4.0/6.4.0/src'
make: *** [dir_target] Error 2

因为api.h的路径不对,可以通过ln -s 下。eg: cd /usr/local/Cellar/ && ln -s ./imagemagick@6/ imagemagick

1
2
3
4
5
6
7
make[1]: Entering directory `/Users/yibo/Downloads/6.4.0/src'
make[2]: Entering directory `/Users/yibo/Downloads/6.4.0/src/magick'
../../Make.rules:175: *** missing separator. Stop.
make[2]: Leaving directory `/Users/yibo/Downloads/6.4.0/src/magick'
make[1]: *** [dir_target] Error 2
make[1]: Leaving directory `/Users/yibo/Downloads/6.4.0/src'
make: *** [dir_target] Error 2

修改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
2
3
4
5
6
7
8
9
10
try {
String property = System.getProperty("java.library.path");
System.out.println(property); // 输出/usr/local/lib
// System.setProperty("java.library.path", "/usr/local/lib");
// System.loadLibrary("JMagick");
System.out.println("success");
MagickInfo magickInfo = new MagickInfo("myImage");
} catch (MagickException e) {
System.out.println(e);
}

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安装

不曾拥有,所以努力。(坚持原创技术分享,您的支持将鼓励我继续创作!)