安装过程(如图所示)
2、安装支持库
linux服务器如果没有安装jpeg v6b、libpng、freetype库,要在安装imagemagick之前先装好,否则imagemagick没法读取jpeg和png图片,字体文件也读不了.(本次安装以redhat为例,进行imagemagick的安装)
----freetype-2.4.4.tar.gz 字体引擎,生产高质量的字形影像输出,(例如彩色文本渲染,挖空等等)。
----zlib-1.2.5.tar.gz 是zlib通用压缩库,图形格式png使用zlib中的deflate压缩算法。
---- jpegsrc.v9a.tar.gz 要处理 jpeg 的库, jpegsrc.v7.tar.gz是必需,还是从源码安装
----libpng-1.5.10.tar.gz 要处理 png 的库,则 libpng-1.5.10.tar.gz 是必需的,还是从源码安装
----libjpeg 支持jpeg v1格式(jpegsrc.v8b.tar.gz)
以下可选:
----jasper-1.900.1.zip 支持jpeg2000(文件扩展名是 .jp2.j2c)
----tiff-3.8.0.tar.gz 支持tif文件 这个用不到,不要安装了
3.安装各种软件
安装jpeg包(建议使用jpegsrc.v8b.tar.gz,下载地址可以从网上查找)
执行的命令:
su root
检查是否已经安装过了
[root@oracle tpl]# rpm -qa | grep jpeg
openjpeg-libs-1.3-7.el6.x86_64
libjpeg-6b-46.el6.x86_64tar -zxvf jpegsrc.v8b.tar.gz
[root@oracle tpl]# rpm -e --allmatches --nodeps libjpeg-6b-46.el6.x86_64
[root@oracle tpl]# tar -zxvf jpegsrc.v8b.tar.gz
[root@oracle tpl]# cd jpeg-8b/
[root@oracle jpeg-8b]# ./configure --enable-shared --enable-static ; make ; make install
安装zlib包:
ftp://ftp.graphicsmagick.org/pub/graphicsmagick/delegates
是zlib通用压缩库,图形格式png使用zlib中的deflate压缩算法,命令如下:
[root@oracle tpl]# rpm -qa | grep zlib
zlib-1.2.3-25.el6.x86_64
[root@oracle tpl]# rpm -e --allmatches --nodeps zlib-1.2.3-25.el6.x86_64
[root@oracle tpl]# tar -zxvf zlib-1.2.5.tar.gz
[root@oracle tpl]# cd zlib-1.2.5
[root@oracle zlib-1.2.5]# ./configure
[root@oracle zlib-1.2.5]#make
[root@oracle zlib-1.2.5]#make install
安装png包:
<a target="_blank" href="http://www.libpng.org/pub/png/pngcode.html">http://www.libpng.org/pub/png/pngcode.html</a>
命令:
[root@oracle zlib-1.2.5]# rpm -qa | grep png
libpng-1.2.44-1.el6.x86_64
[root@oracle zlib-1.2.5]# rpm -e --allmatches --nodeps libpng-1.2.44-1.el6.x86_64
[root@oracle zlib-1.2.5]#tar -xzvf libpng-1.2.12.tar.gz
[root@oracle zlib-1.2.5]#cd libpng-1.2.12
[root@oracle zlib-1.2.5]#./configure (注意:此处不要使用网上的通过cp script下的makefile的方式执行的那种,不然在安装imagemagick的时候出错)
安装freetype
[root@oracle zlib-1.2.5]# rpm -qa | grep freetype
[root@oracle zlib-1.2.5]# tar –zxvf freetype-2.4.4.tar.gz
[root@oracle zlib-1.2.5]#./configure
[root@oracle zlib-1.2.5]# make
[root@oracle zlib-1.2.5]# make install
安装tiff包
下载地址:ftp://ftp.graphicsmagick.org/pub/graphicsmagick/delegates
ftp://ftp.remotesensing.org/libtiff/
安装后才能处理tiff格式图片
tar -xzvf tiff-3.8.0.tar.gz
cd tiff-3.8.0
./configure
make
make install
我安装完成后,在命令行处理图片,报错:libtiff.so.3: cannot open shared object file: no such file ordirectory
这个模块也用不到, 就不要安装了.
安装jasper包:
安装后才能处理jpeg2000格式图片(文件扩展名是 .jp2 .j2c)
命令如下:
unzip jasper-1.900.1.zip
cd jasper-1.900.1
cflags=-fpic ./configure
make cflags=-fpic
make cflags=-fpic install
三、在linux上用源码编译安装imagemagick与jmagick
------------------------------------------------------------------------------------------------------------------
下载imagemagick和jmagick
jmagick在imagemagick官网首页左侧菜单的program interfaces菜单中找到jmagick。进入jmagick的主页。
我们下载:
imagemagick-6.4.0-0.tar.gz
jmagick-6.4.0-src.tar.gz
解压imagemagick,查看imagemagick的安装说明文件install-unix.txt就知道怎么安装imagemagick了。
解压jmagick,查看jmagick的安装说明文件install就知道怎么安装jmagick了。
4.安装imagemagick
修改文件执行权限:chmod -r 755 文件名
tar zvxf imagemagick-6.4.0-0.tar.gz
cd imagemagick-6.4.0-0
./configure cc=gcc cxx=c++ cppflags='-i/usr/local/include' ldflags='-l/usr/local/lib -r/usr/local/lib' --with-quantum-depth=8 --enable-shared --without-perl
make cflags=-fpic (红色字体的是必须的)
make install
若想卸载,可以使用:make uninstall
另外,关于configure中的说明,如下:
configure参数说明:
--enable-shared 编译成共享库
--disable-static 不编译成静态库
--disable-openmp 禁用多线程,使用多线程性能并没有提高,但cpu占用达到了100%,所以禁用了。
--with-quantum-depth=8 使用8位色深。我的1200万像素数码相机,照出的图片就是8位色深。
--with-windows-font-dir=目录 ,指明字体文件的目录(后面将人工复制中文字体文件到这个目录)
configure 完成后,一定要检查im支持的图片格式种类,configure 完成后出会输出类似如下图的信息,请仔细检查。(信息不一定和下图一样,请根据实际情况自行分析)
验证configuration情况:identify -list configure
验证支持的图片格式:identify -list format
关于q8,q16,q32的说明:(建议使用8,现在数码相机照的相片,每一种颜色就是8位深,3种颜色就是24位,所以选8)
支持的参数有3种,分别是 8, 16, or 32。默认值是16。
q8表示: 8-bits per pixel quantum
q16表示:16-bits per pixel quantum
q32表示:32-bits per pixel quantum
使用16-bit per pixel quantums在处理图片时比8-bit慢15%至50%,并须要更多的内存。
处理一张1024x768像素的图片8-bit要使用3.6m内存,16-bit要使用7.2m内存。计算方法是: (5 * quantum depth * rows *columns) / 8
使用convert –version检查是否已经安装成功了
若出现下面的输出说明已经安装成功了
version: imagemagick 6.4.0 09/25/16 q8 http://www.imagemagick.org
copyright: copyright (c) 1999-2008 imagemagick studio llc
使用convert -list format检查支持的文件类型。检查列表中是否有jpg和png格式的。若没有这两个文件,说明是jpeg包和png包没装好,因为imagemagick依赖jpeg包和png包。
imagemagick的使用(参考百度:http://jingyan.baidu.com/article/948f59245ec02dd80ff5f989.html):
参考命令:
转换格式命令:
# convert -format demo.jpg demo.png
将jpg转换成png
指定大小缩放:
# convert -resize "500x300>" demo.jpg demo_500.jpg
如果图片比500x300小就保持原样,以防小图片被放大失真
去除多余信息:
#convert -strip input.jpg output.jpg
将多余的信息去除:摄影时的光圈、快门、iso、日期时间等各种与当时摄影条件相关的讯息,相机品牌型号,色彩编码,拍摄时录制的声音以及全球定位系统(gps)等信息。
压缩比:
#convert -quality 75% demo.jpg demo_75.jpg
imagemagick的命令很多 具体可以查看官方手册
http://www.imagemagick.org/script/command-line-tools.php
5.安装jdk,参考博文如下:
安装jdk,参考博文:http://blog.csdn.net/tototuzuoquan/article/details/18188109
6、安装jmagick
tar zvxf jmagick-6.4.0-src.tar.gz
cd 6.4.0
./configure --prefix=/usr/local/lib/jmagick-6.4.0 --with-java-home=/usr/java/jdk1.6.0_45 -with-magick-home=/usr/local/lib/imagemagick-6.4.0
make all
下面几步测试可以不执行
make simpletest 因没有junit的jar包报2个错误,不用管。
make test
make javadoc
安装成功后,在/usr/local/lib/jmagick-6.4.0/lib/有一个jmagick-6.4.0.jar文件,在你的java项目中就使用这个jar文件处理图片。
记住jmagick-6.4.0.jar是使用前面你指定的jdk1.6编译出来的,所以不能在jdk为1.5的环境下使用jmagick-6.4.0.jar。
如果你执行了make javadoc,在/usr/local/lib/jmagick-6.4.0/share/doc目录下就有文档。
另外:部署项目后,会发现会报: could not initializeclass magick.imageinfo的问题,
解决办法
步骤1::进入/usr/local/lib/jmagick-6.4.0
[root@oracle lib]# cd /usr/local/lib/jmagick-6.4.0/lib
[root@oracle lib]# ls
jmagick-6.4.0.jar libjmagick-6.4.0.so libjmagick.so
[root@oracle lib]#cp jmagick-6.4.0.jar /newdisk/ucmsserver/tomcat/bin/ (将jmagick-6.4.0.jar放到tomcat中的bin中一份)
cp /newdisk/ucmsserver/tomcat/webapps/app-tpl-webapp/web-inf/lib/jmagick-6.4.0.jar /usr/java/jdk1.6.0_45/jre/lib/ext (将jar包拷贝一份到jdk中的jre/lib/ext中)
注意把自己工程lib包中的jmagick的jar包也改成jmagick-6.4.0.jar。
步骤2:编写test.java
public class test {
public static void main(string[] args) {
system.out.println(system.getproperty("java.library.path"));
}
}
执行命令:javac test.java java test
[root@oracle tpl]# javac test.java
[root@oracle tpl]# java test
/usr/java/jdk1.6.0_45/jre/lib/amd64/server:/usr/java/jdk1.6.0_45/jre/lib/amd64:/usr/java/jdk1.6.0_45/jre/../lib/amd64:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
[root@oracle tpl]# cd /usr/local/lib/jmagick-6.4.0/lib
jmagick-6.4.0.jar libjmagick-6.4.0.so libjmagick.so
风别把上面的.so文件放到/usr/java/jdk1.6.0_45/jre/lib/amd64/server:/usr/java/jdk1.6.0_45/jre/lib/amd64:/usr/java/jdk1.6.0_45/jre/../lib/amd64:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib中的各包下,命令如下:
[root@oracle lib]# cp *.so /usr/java/jdk1.6.0_45/jre/lib/amd64/server
[root@oracle lib]# cp *.so /usr/java/jdk1.6.0_45/jre/lib/amd64
[root@oracle lib]# cp *.so /usr/java/packages/lib/amd64
[root@oracle lib]# cp *.so /usr/lib64
[root@oracle lib]# cp *.so /lib64
[root@oracle lib]# cp *.so /lib
[root@oracle lib]# cp *.so /usr/lib
最后重启tomcat,重新访问自己的工程,发现裁剪效果正常了。
四、在windows上安装imagemagick与jmagick
--------------------------------------------------------------------------
在windows安装很简单,关于q8与q16区别,前有说明是一样的。
有动态版(dll),有静态版(static),建议使用动态版。
如果安装q8,请使用文件:
imagemagick-6.3.9-0-q8-windows-dll.exe
jmagick-win-6.3.9-q8.zip
如果安装q16,请使用文件:
imagemagick-6.3.9-0-q16-windows-dll.exe
jmagick-win-6.3.9-q16.zip
我们以q8为例:
1、运行imagemagick-6.3.9-0-q8-windows-dll.exe,一路下一步,imagemagick就安装好了
2、解压jmagick-win-6.3.9-q8.zip,把jmagick.dll放入system32,在你的java项目中使用jmagick.jar包处理图片。
当将dll放到system32中后、需要重启一下电脑。
将jmagick-6.2.4.jar放到tomcat\lib中。
maven中在pom文件中添加上依赖:
<dependency>
<groupid>jmagick</groupid>
<artifactid>jmagick</artifactid>
<version>6.2.4</version>
</dependency>
六、常见问题以及解决方法:
--------------------------------------------------------------------------
1、system.out.println(system.getproperty("java.library.path")).
直接用system.out.println(system.getproperty("java.library.path")).
打印出当前环境的路径,然后再把jmagick.dll或jmagick.so 复制到其中的一个路径文件夹中问题解决。
2、magick.magickexception: no image to scale
版本不匹配,要像下面这们,都是同一个版本号
3、magick.magickexception: unable to retrieve handle
要调用 magick.magickimage.destroyimages() 来关闭
4、no decode delegate for this image format
使用:identify -list format
判断有支持几种图片格式,没有的则需要安装对应的格式库
5、单线程转换每张图片大概50ms,两个线程却需要500ms
用convert --version 命令查看
看是否出现openmp字样,出现的话,是因为机器不支持openmp导致的。
需要重新编译./configure --disable-openmp 在进行安装
首先检查一下电脑里已经安装的imagemagick版本:
convert -version
6、exceptionin thread "main" java.lang.unsatisfiedlinkerror:c:\windows\system32\jmagick.dll: can't find dependent libraries
我在windows xp上按照上面的流程安装完成,按理说应该没有问题了,但出现了以上错误。
我打开eclipse已工作数个小时,然后在开发机器(我本机)windows xp上安装imagemagick-6.3.9-0-q16-windows-dll.exe。也把jmagick.dll放入system32,在你的java项目中使用jmagick.jar包处理图片。
就这么几步当然不会错,但在运行程序时还是出现了上面的错误。
解决:重启eclipse。加载新的环境变量。
七、代码实现
package com.xxx.tpl.utils;
import java.awt.dimension;
import java.awt.point;
import java.awt.rectangle;
import java.io.file;
import java.io.ioexception;
import magick.compositeoperator;
import magick.compressiontype;
import magick.drawinfo;
import magick.imageinfo;
import magick.magickexception;
import magick.magickimage;
import magick.pixelpacket;
import magick.previewtype;
public class jmagickutil {
public static void main(string[] args) throws magickexception, ioexception {
// test for function imageresize
jmagickutil.imageresize("e:/ucmsserver/tomcat/webapps/temp/tpl/snapshot/2016/9/25955ea769ff47ada6b84f7b39cee904.png",
"d:/installed/tomcat/webapps/tpl/special/2016/9/d26076f602284c3eac1abaa71d2378b2/thumbnail/big/2016/9/25955ea769ff47ada6b84f7b39cee904.png", 160, 160);
// jmagicjwrapper.imageresize("pics.jpg", "resize250x200.jpeg", 250,
// 200);
// jmagicjwrapper.imageresize("pics.jpg", "resize50x50.jpg", 50, 50);
// jmagicjwrapper.imageresize("pics.jpg", "resize120x120.bmp", 120,
// 120);
// jmagicjwrapper.imageresize("pics.jpg", "resize.tif", 20, 30);//not
// create file
//
// test for function createwaterprintbyimg
// jmagickutil.createwaterprintbyimg("f://1.jpg", "f://4.jpg",
// "f://watermark.gif", new point(0, 0));
// jmagicjwrapper.imageresize("wpl.gif", "logo250x200.gif", 250, 200);
// because file "wpl.gif" may not be release, the later function cause a
// error, can not open file handle.
// jmagicjwrapper.createwaterprintbyimg("pics.jpg", "wpl.gif",
// "logofull.jpg", new point(1680,1050));//not create file
// jmagicjwrapper.createwaterprintbyimg("pics.jpg", "wpl.gif",
// "logoext.jpg", new point(2000,1000));//not create file
// test for function createwaterprintbytext
// this function can not handle chinese character, i'll continue to
// takle the issue
// jmagicjwrapper.createwaterprintbytext("pics1.jpg", "wpt.gif",
// "for test", new point(300,300), 100);
}
private static final string[] type = { ".jpg", ".jpeg", ".bmp", ".gif",
".png" };
public static boolean checktype(string path) {
for (int i = 0; i < type.length; i++) {
if (path.touppercase().endswith(type[i])) {
return true;
} else {
continue;
}
}
return false;
/**
* 改变图片大小
*
* @param filepath
* 原图片位置 topath 新图片位置 width 新图片的宽度 height 新图片的高度
* @return
* @throw
* @author 2010-8-11
* @throws ioexception
*/
public static void imageresize(string filepath, string topath, int width,
int height) throws magickexception, ioexception {
//必须写,否则jmagick.jar的路径找不到
system.setproperty("jmagick.systemclassloader","no");
file fileori = new file(filepath);
file filedes = new file(topath);
if (!fileori.exists()) {
return;
if (!filedes.exists()) {
string parentpath = filedes.getparent();
new file(parentpath).mkdirs();
filedes.createnewfile();
imageinfo info = null;
magickimage image = null;
dimension imagedim = null;
magickimage scaled = null;
if (!checktype(filepath) || !checktype(topath)) {
try {
info = new imageinfo(filepath);
image = new magickimage(info);
imagedim = image.getdimension();
if (width <= 0 || height <= 0) {
height = 120;
width = 120;
scaled = image.scaleimage(width, height);
scaled.setfilename(topath);
scaled.writeimage(info);
} finally {
if (scaled != null) {
scaled.destroyimages();
* 创建图片水印
* 源文件路径 toimg 生成文件位置 logopath logo路径 pos logo在源图片中的相对位置,以像素点为单位
* @throw magickexception
public static void createwaterprintbyimg(string filepath, string toimg,
string logopath, point pos) throws magickexception {
if (!checktype(filepath) || !checktype(toimg) || !checktype(logopath)) {
imageinfo info = new imageinfo();
magickimage fimage = null;
magickimage simage = null;
magickimage flogo = null;
magickimage slogo = null;
dimension logodim = null;
// 原来图片
fimage = new magickimage(new imageinfo(filepath));
imagedim = fimage.getdimension();
int width = imagedim.width;
int height = imagedim.height;
simage = fimage.scaleimage(width, height);
flogo = new magickimage(new imageinfo(logopath));
logodim = flogo.getdimension();
int lw = logodim.width;
int lh = logodim.height;
slogo = flogo.scaleimage(lw, lh);
// 开始打水印,从左上角开始;如果到右边界则重新开始一行的打印(x=0,y=y+h)
int startx = 0;
int starty = 0;
do {
simage.compositeimage(compositeoperator.atopcompositeop, slogo,
startx, starty);
startx += (logodim.width + 60);
if (startx >= width) {
starty += logodim.height * 2;
startx = 0;
}
} while (starty <= height);
simage.setfilename(toimg);
simage.writeimage(info);
if (fimage != null) {
fimage.destroyimages();
if (simage != null) {
simage.destroyimages();
if (flogo != null) {
flogo.destroyimages();
if (slogo != null) {
slogo.destroyimages();
* 创建文字水印
* 源文件路径 toimg 生成文件位置 text 水印文本 pos logo在源图片中的相对位置,以像素点为单位
* pointsize 用于设置点阵大小
public static void createwaterprintbytext(string filepath, string toimg,
string text, point pos, int pointsize) throws magickexception {
if (!checktype(filepath) || !checktype(toimg)) {
if (null == text || "".equals(text)) {
text = "";
imageinfo info = new imageinfo(filepath);
if (filepath.touppercase().endswith("jpg")
|| filepath.touppercase().endswith("jpeg")) {
info.setcompression(compressiontype.jpegcompression); // 压缩类别为jpeg格式
info.setpreviewtype(previewtype.jpegpreview); // 预览格式为jpeg格式
info.setquality(95);
magickimage aimage = new magickimage(info);
dimension imagedim = aimage.getdimension();
int width = imagedim.width;
int height = imagedim.height;
if (width <= (int) pos.getx() || height <= (int) pos.gety()) {
pos.setlocation(0, 0);
int a = 0;
int b = 0;
string[] as = text.split("");
for (string string : as) {
if (string.matches("[/u4e00-/u9fa5]")) {
a++;
if (string.matches("[a-za-z0-9]")) {
b++;
int tl = a * 12 + b * 6;// 字符长度
magickimage scaled = aimage.scaleimage(width, height);
if (width > tl && height > 5) {
drawinfo ainfo = new drawinfo(info);
ainfo.setfill(pixelpacket.querycolordatabase("white"));
ainfo.setundercolor(new pixelpacket(65535, 65535, 65535, 65535));// 设置为透明颜色
ainfo.setpointsize(pointsize);
// 解决中文乱码问题,自己可以去随意定义个自己喜欢字体,我在这用的微软雅黑
string fontpath = "c:/windows/fonts/msimhei.ttf";
// string fontpath = "/usr/maindata/msyh.ttf";
ainfo.setfont(fontpath);
ainfo.settextantialias(true);
ainfo.setopacity(0);// 透明度
ainfo.settext(text);
ainfo
.setgeometry("+"
+ ((int) pos.getx() + "+" + (int) pos.gety()));
scaled.annotateimage(ainfo);
scaled.setfilename(toimg);
scaled.writeimage(info);
scaled.destroyimages();
* 切取图片
* @param imgpath
* 原图路径 topath 生成文件位置 w 左上位置横坐标 h 左上位置竖坐标 x 右下位置横坐标 y 右下位置竖坐标
public static void cutimg(string imgpath, string topath, int w, int h,
int x, int y) throws magickexception {
imageinfo infos = null;
magickimage cropped = null;
rectangle rect = null;
infos = new imageinfo(imgpath);
image = new magickimage(infos);
rect = new rectangle(x, y, w, h);
cropped = image.cropimage(rect);
cropped.setfilename(topath);
cropped.writeimage(infos);
if (cropped != null) {
cropped.destroyimages();
* 删除图片文件
* @param src 图片位置
* @author 2010-8-11
public static boolean removefile(string src) throws securityexception {
if (!checktype(src)) {
return false;
file file = new file(src);
return file.delete();
} catch (exception e) {
e.printstacktrace();
return false;