日期:2014-05-16  浏览次数:20696 次

JMagick在linux下的安装和使用
JMagick在linux下的安装和使用

准备如下包:
freetype-2.1.10.tar.gz
ImageMagick-6.2.6.tar.gz
jasper-1.900.1.zip
JMagick-6.2.6-0.tar.gz
jpegsrc.v6b.tar.gz
libpng-1.2.12.tar.gz
tiff-3.8.2.tar.gz
版本之间相互匹配才能使用,无须下载最新版本
本实例的相关包见附件。

1.安装libpng
tar -xzvf libpng-1.2.12.tar.gz
cd ibpng-1.2.12
./configure
make
make install
检查是否安装完成
rpm -qa | grep libpng

2.安装libjpeg
tar -xzvf jpegsrc.v6b.tar.gz
cd jpeg-6b
./configure
make
make install
提示user/local/man/man1目录不存在,安装失败
mkdir /usr/local/man/man1
继续执行:
make install
检查是否安装完成
rpm -qa | grep libjpeg

3.安装libtiff
tar -xzvf tiff-3.8.2.tar.gz
cd tiff-3.8.2
./configure
make
make install
检查是否安装完成
rpm -qa | grep libtiff

4.安装jasper
unzip jasper-1.900.1.zip
cd jasper-1.900.1
CFLAGS=-fPIC  ./configure
make CFLAGS=-fPIC
make  CFLAGS=-fPIC install
检查是否安装完成
rpm -qa | grep jasper

5.安装freetype
tar -xzvf freetype-2.1.10.tar.gz
cd freetype-2.1.10
./configure
make install
检查是否安装完成
rpm -qa | grep freetype

6.安装ImageMagick
tar xzvf ImageMagick-6.2.6.tar.gz
cd ImageMagick-6.2.6
./configure --prefix=/opt/ImageMagick-6.2.6  --enable-share --enable-static  --with-jpeg=yes  --with-png=yes  --with-tiff=yes --with-jp2=yes --without-perl
make

Magick++/lib/Image.cpp: In function 'void Magick::InitializeMagick(const char*)':
Magick++/lib/Image.cpp:3811: error: 'atexit' was not declared in this scope
make: *** [Magick++/lib/Image.lo] 错误 1
后来发现原来是gcc版本的问题。 我自己的笔记本的gcc版本比较新,对于旧的写法有些不兼容。
旧的版本gcc某些不需要明确的声明include的地方,在新的gcc中不再支持,必须明确的声明。

进入ImageMagick目录下的Magick++/lib目录下,编辑Image.cpp文件,在头部include声明的代码中增加一行:
#include <stdlib.h>

重新make就可以了。
make
make install

检查是否安装成功:
cd /home/ImageMagick-6.8.6/bin
./convert  -resize 50x50 test.jpg new.jpg

7.安装JMagick
tar xzvf JMagick-6.2.6-0.tar.gz
cd JMagick-6.2.6-0
autoconf
./configure --prefix=/opt/JMagick  --with-magick-home=/opt/ImageMagick-6.2.6 --enable-share --enable-static --with-java-home=/home/jdk1.6.0_13
make all
make install
make test

生成/opt/JMagick文件夹lib下有jmagick.jar,libJMagick.so
拷贝jmagick.jar,libJMagick.so到如下目录:
1.WEB容器的lib下,如:/home/resin-3.1.12/lib,/home/tomcat-6.0.5/lib
2.JDK的lib下,/home/jdk1.6.0_13/lib
3.ImageMagick的lib下,/opt/ImageMagick/lib

8.配置环境变量
export PATH=$PATH:/opt/ImageMagick/bin
export LD_LIBRARY_PATH=:/opt/JMagick/lib:/opt/ImageMagick/lib
export DYLD_LIBRARY_PATH=:/opt/JMagick/lib:/opt/ImageMagick/lib
export CLASSPATH=$CLASSPATH:/opt/JMagick/lib

9.使用时注意:在Web Application Server(Resin,Tomcat),需要再运行时加入参数: -Djmagick.systemclassloader=no
或者在程序中写入:System.setProperty("jmagick.systemclassloader", "no");

10.异常
  magick.MagickException: Cannot obtain image handle
  这个异常出现的情况有很多种,有可能是图片的路径不对,也有可能环境变量配置不正确,也有可能是内部程序异常。
  使用过程中异常的常见的出现次序:
(1)java.lang.NoClassDefFoundError: Could not initialize class magick.ImageInfo (环境变量、lib下对应的Jar相关)
(2)java.lang.UnsatisfiedLinkError: no JMagick in java.library.path             (Resin,Tomcat的lib下无jmagick.jar,libJMagick.so文件相关)
(3)magick.MagickException: Cannot obtain image handle                          (多种情况!)