Jmagick图形图像处理

胡升阳 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();
		}
	}
}


4张原图:


处理后的图片:

1。 2。


3。 4。


5。

6。


7。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值