本文主要是介绍在windows和Linux上安装ImageMagick与jmagick,Maven配置、Java图片压缩代码(整理网上、结合自己情况、编写出来的新安装方式),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
安装过程(如图所示)
若想使用imagemagick,需要安装各种依赖库、一步小心,可能就会安装错误。其中ImageMagick的访问地址为: http://www.imagemagick.org/script/index.php
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 |
安装zlib包:
下载地址:http://www.zlib.net/
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 |
安装png包:
下载地址:http://sourceforge.net/projects/libpng/
ftp://ftp.graphicsmagick.org/pub/GraphicsMagick/delegates
http://www.libpng.org/pub/png/pngcode.html
命令:
[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]#./configure (注意:此处不要使用网上的通过cp script下的makefile的方式执行的那种,不然在安装ImageMagick的时候出错) |
安装freetype
下载地址:http://www.freetype.org/
ftp://ftp.graphicsmagick.org/pub/GraphicsMagick/delegates
命令:
[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 |
安装Tiff包
下载地址:ftp://ftp.graphicsmagick.org/pub/GraphicsMagick/delegates
ftp://ftp.remotesensing.org/libtiff/
安装后才能处理TIFF格式图片
命令:
tar -xzvf tiff-3.8.0.tar.gz |
我安装完成后,在命令行处理图片,报错:libtiff.so.3: cannot open shared object file: No such file ordirectory
这个模块也用不到, 就不要安装了.
安装jasper包:
下载地址:http://www.ece.uvic.ca/~mdadams/jasper/
安装后才能处理JPEG2000格式图片(文件扩展名是 .jp2 .j2c)
命令如下:
unzip jasper-1.900.1.zip |
三、在Linux上用源码编译安装ImageMagick与jmagick
------------------------------------------------------------------------------------------------------------------
下载ImageMagick和JMagick
Jmagick在ImageMagick官网首页左侧菜单的Program Interfaces菜单中找到jmagick。进入jmagick的主页。
我们使用6.4版本,下载地下是:http://downloads.jmagick.org/6.4.0/
我们下载:
ImageMagick-6.4.0-0.tar.gz
jmagick-6.4.0-src.tar.gz
文档在:http://downloads.jmagick.org/jmagick-doc/
解压ImageMagick,查看ImageMagick的安装说明文件Install-unix.txt就知道怎么安装ImageMagick了。
解压jmagick,查看jmagick的安装说明文件INSTALL就知道怎么安装jmagick了。
4.安装ImageMagick
修改文件执行权限:chmod -R 755 文件名
命令如下:
tar zvxf ImageMagick-6.4.0-0.tar.gz
./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 uninstall |
另外,关于configure中的说明,如下:
configure参数说明:
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
提醒:JMagick不适合在Web应用中使用,请参看:JMagick的JNI-hazard问题
修改文件执行权限:chmod -R 755 文件名
命令如下:
tar zvxf jmagick-6.4.0-src.tar.gz
下面几步测试可以不执行 安装成功后,在/usr/local/lib/jmagick-6.4.0/lib/有一个jmagick-6.4.0.jar文件,在你的java项目中就使用这个jar文件处理图片。
|
另外:部署项目后,会发现会报: 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 [root@oracle lib]# ls 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
版本不匹配,要像下面这们,都是同一个版本号
ImageMagick-6.4.0-0.tar.gz
jmagick-6.4.0-src.tar.gz
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)) { return; }
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(); } } }
/** * 创建图片水印 * * @param filePath * 源文件路径 toImg 生成文件位置 logoPath logo路径 pos logo在源图片中的相对位置,以像素点为单位 * @return * @throw MagickException * @author 2010-8-11 */ public static void createWaterPrintByImg(String filePath, String toImg, String logoPath, Point pos) throws MagickException { if (!checkType(filePath) || !checkType(toImg) || !checkType(logoPath)) { return; }
ImageInfo info = new ImageInfo(); MagickImage fImage = null; MagickImage sImage = null; MagickImage fLogo = null; MagickImage sLogo = null; Dimension imageDim = null; Dimension logoDim = null; try { // 原来图片 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); } finally { if (fImage != null) { fImage.destroyImages(); } if (sImage != null) { sImage.destroyImages(); } if (fLogo != null) { fLogo.destroyImages(); } if (sLogo != null) { sLogo.destroyImages(); } } }
/** * 创建文字水印 * * @param filePath * 源文件路径 toImg 生成文件位置 text 水印文本 pos logo在源图片中的相对位置,以像素点为单位 * pointSize 用于设置点阵大小 * @return * @throw MagickException * @author 2010-8-11 */ public static void createWaterPrintByText(String filePath, String toImg, String text, Point pos, int pointSize) throws MagickException { if (!checkType(filePath) || !checkType(toImg)) { return; }
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 右下位置竖坐标 * @return * @throw MagickException * @author 2010-8-11 */ public static void cutImg(String imgPath, String toPath, int w, int h, int x, int y) throws MagickException { ImageInfo infoS = null; MagickImage image = null; MagickImage cropped = null; Rectangle rect = null; try { 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);
} finally { if (cropped != null) { cropped.destroyImages(); } } }
/** * 删除图片文件 * * @param src 图片位置 * @return * @throw * @author 2010-8-11 */ public static boolean removeFile(String src) throws SecurityException { try { if (!checkType(src)) { return false; }
File file = new File(src); return file.delete(); } catch (Exception e) { e.printStackTrace(); return false; } }
} |
这篇关于在windows和Linux上安装ImageMagick与jmagick,Maven配置、Java图片压缩代码(整理网上、结合自己情况、编写出来的新安装方式)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!