胡升阳 2012.02.28
一、简介
JMagick是一个开源API,利用JNI(Java Native Interface)技术实现了对ImageMagickAPI的Java访问接口,因此也将比纯Java实现的图片操作函数在速度上要快。JMagick只实现了ImageMagicAPI的一部分功能,它的发行遵循LGPL协议。
它用来创建、编辑、合成图片的软件。它可以读取、转换、写入多种格式的图片。图片切割、颜色替换、各种效果的应用,图片的旋转、组合,文本,直线,多边形,椭圆,曲线,附加到图片伸展旋转。ImageMagick是免费软件:全部源码开放,可以自由使用,复制,修改,发布。支持大多数的操作系统。
Jmagic官方网站:http://www.jmagick.org/ 。
下载地址:http://downloads.jmagick.org/ 。
API文档:http://downloads.jmagick.org/jmagick-doc/
建议下载6.3.9版本,因为这个版本中包含的细节版本及依赖软件最全面,别的版本里面均不包含依赖软件。
这里包含jmagick-win-6.3.9-Q8.zip和jmagick-win-6.3.9-Q16.zip两个版本,这两个版本的区别:Q8支持8bit图形,节省内存;Q16支持16bit图形,消耗内存资源更多一些。
为了节省内存,建议下载使用jmagick-win-6.3.9-Q8.zip 及其对应的ImageMagick-6.3.9-Q8-windows-dll.exe。
二、安装
1、双击“ImageMagick-6.3.9-Q8-windows-dll.exe”,一直next下去,即可安装完成。该软件会自动将自己添加到系统环境变量中。
2、将该软件安装后的根目录下的所有dll文件拷贝到C:\WINDOWS\system32目录中。
3、解压jmagick-win-6.3.9-Q8.zip,解压后的文件夹中包含jmagick.dll和jmagick.jar两个文件,将jmagick.dll也拷贝到C:\WINDOWS\system32目录中,将jmagick.jar拷贝到项目的lib文件夹下即可。
4、这样环境就搭建好了。
注:因为jmagick-win-6.3.9-Q8.zip是在jdk1.4.2环境下编译完成的,因此只要jdk版本不低于1.4.2就可以正常使用该jar包。
三、代码测试
import java.awt.Rectangle; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import magick.ImageInfo; import magick.MagickImage; /** * @author adam.胡升阳 创建日期 2012-2-27 */ public class JmagickTest { public JmagickTest() { super(); } /** * 缩放图片--重置图片的大小 * @param srcPackage 源图片文件夹 * @param srcFileName 源图片名称 * @param toPackage 目的图片文件夹 * @param toFileName 目的图片名称 * @param w 目的图片宽度 * @param h 目的图片高度 * @throws IOException */ public void resize(String srcPackage, String srcFileName, String toPackage, String toFileName, int w, int h) { try { // Resize System.setProperty("jmagick.systemclassloader", "no"); ImageInfo info = new ImageInfo(srcPackage + srcFileName); // String sourceFileName = "D:/test/fileSource/003.jpg"; MagickImage image = new MagickImage(info); MagickImage scaled = image.scaleImage(w, h); // 小图片文件的大小. scaled.setFileName(toPackage + toFileName); // String targetFile = "D:/test/desk/003.jpg"; scaled.writeImage(info); } catch (Exception ex) { System.out.println(ex); } } /** * 裁剪图片 * * @param srcPackage * 源图片文件夹 * @param srcFileName * 源图片名称 * @param toPackage * 目的文件件 * @param toFileName * 目的文件名 * @param x * 图片左上角的x坐标 * @param y * 图片左上角的y坐标 * @param w * 截取图片的宽度 * @param h * 截取图片的高度 */ public void cropImage(String srcPackage, String srcFileName, String toPackage, String toFileName, int x, int y, int w, int h) { MagickImage cropImage = null; try { String srcPath = srcPackage + srcFileName; ImageInfo infoS = new ImageInfo(srcPath); MagickImage image = new MagickImage(infoS); Rectangle rect = new Rectangle(x, y, w, h); cropImage = image.cropImage(rect); String toPath = toPackage + toFileName; cropImage.setFileName(toPath); cropImage.writeImage(infoS); } catch (Exception e) { e.printStackTrace(); } finally { if (cropImage != null) { cropImage.destroyImages(); } } } /** * 裁剪图片 * * @param srcPackage * 源图片文件夹 * @param srcFileName * 源图片名称 * @param toPackage * 目的文件件 * @param toFileName * 目的文件名 * @param x * 图片左上角的x坐标 * @param y * 图片左上角的y坐标 * @param w * 截取图片的宽度 * @param h * 截取图片的高度 */ public void chopImage(String srcPackage, String srcFileName, String toPackage, String toFileName, int x, int y, int w, int h) { MagickImage chopImage = null; try { String srcPath = srcPackage + srcFileName; ImageInfo infoS = new ImageInfo(srcPath); MagickImage image = new MagickImage(infoS); Rectangle rect = new Rectangle(x, y, w, h); chopImage = image.cropImage(rect); String toPath = toPackage + toFileName; chopImage.setFileName(toPath); chopImage.writeImage(infoS); } catch (Exception e) { e.printStackTrace(); } finally { if (chopImage != null) { chopImage.destroyImages(); } } } /** * 合并图片 * @param srcPathList 源图片路径名称列表 * @param toPathFile 合并后图片路径名称 * @param orientation 合并方位:横向(+)、纵向(-) * @return */ public void convert(List srcPathList,String toPathFile,String orientation){ /* 合并图片命令格式: * convert +append 1.jpg 2.jpg 3.jpg ... 0.jpg //横向合并(最后一个为合并成功的文件名称) * convert -append 1.jpg 2.jpg 3.jpg ... 0.jpg //纵向合并(最后一个为合并成功的文件名称) */ StringBuffer command = new StringBuffer(""); command.append("convert "); command.append(orientation+"append "); int length = srcPathList.size(); for(int i=0;i<length;i++){ command.append(srcPathList.get(i)+" "); } command.append(toPathFile); String[] str = {command.toString()}; JmagickTest.exec(str); } /** * 调用windows的命令行并执行命令 * @param command 命令行窗口中要执行的命令字符串 */ public static void exec(String[] command) { Process proc; InputStream is = null; String comman = command[0]; System.out.println("命令为:"+comman); String[] cmd = {"cmd.exe","/c",comman}; try { proc = Runtime.getRuntime().exec(cmd); int result = proc.waitFor(); System.out.println("Process result:" + result); is = proc.getInputStream(); byte[] b = new byte[1024]; is.read(b); System.out.println("b:" + b); is.close(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { JmagickTest obj = new JmagickTest(); try { /*String srcPackage = "D:/test/fileSource/"; String srcFileName = "004.jpg"; String toPackage = "D:/test/desk/"; String toFileName = "004.jpg";*/ //File in =new File(srcPackage+srcFileName); //File out = new File(toPackage+toFileName); //obj.cropImage(srcPackage, srcFileName, toPackage, toFileName, 200, 200, 300, 200); //截图 //obj.chopImage(srcPackage, srcFileName, toPackage, toFileName, 200, 200, 300, 200); //截图 //obj.resize(srcPackage, srcFileName, toPackage, toFileName,300, 200); //缩放 List srcFileList1 = new ArrayList(); srcFileList1.add("D:/test/desk/003.jpg"); srcFileList1.add("D:/test/desk/004.jpg"); String toPath1 = "D:/test/desk/_003_004.jpg"; obj.convert(srcFileList1,toPath1,"+"); List srcFileList2 = new ArrayList(); srcFileList2.add("D:/test/desk/001.jpg"); srcFileList2.add("D:/test/desk/002.jpg"); String toPath2 = "D:/test/desk/_001_002.jpg"; obj.convert(srcFileList2,toPath2,"+"); List srcFileList3 = new ArrayList(); srcFileList3.add(toPath1); srcFileList3.add(toPath2); String toPath3 = "D:/test/desk/_001_002_003_004.jpg"; obj.convert(srcFileList3,toPath3,"-"); } catch (Exception e) { e.printStackTrace(); } } }
处理后的图片: