胡升阳 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。
分享到:
相关推荐
JMagick还提供了旋转、调整大小、色彩校正、滤镜应用等一系列图像处理操作,极大地丰富了Java应用的图形处理能力。 JMagick-win-6.3.9的安装通常包括以下步骤: 1. 下载:首先,你需要从官方网站或者可靠的第三方...
而“java”和“图形处理”标签则明确了JMagick的核心功能,即在Java平台上进行高效、灵活的图像处理。 总之,JMagick-5.5.6-0是Java Web开发中的一个强大工具,它使开发者能够方便地利用ImageMagick的强大功能,为...
### Jmagick 图片处理知识点 #### 一、概述 Jmagick 是一个 Java 接口,用于 ImageMagick 图形库,它提供了一系列强大的...了解并掌握 Jmagick 的使用方法对于从事 Web 开发、图像处理等领域的人来说是十分重要的。
JavaMagick和JMagick提供了Java接口,将ImageMagick的命令行工具转换为Java API,使得开发者能够通过编写代码实现图像处理任务,而无需直接操作命令行。 ImageMagick的核心功能包括: 1. **图像格式转换**:可以将...
综上所述,这篇博客可能详细讲解了如何在Java中使用Dimension类来定制图片的显示尺寸,涉及到源码分析、GUI布局管理和可能与JMagick这样的图像处理库的集成。学习这些内容对于进行Java GUI编程和图像处理的开发者来...
ImageMagick是一款强大的开源图像处理工具,用于在各种操作系统上创建、编辑和转换位图图像。这个特定的版本,"ImageMagick-6.3.9-0-Q16-windows-dll",是专为Windows环境设计的动态链接库(DLL)版本,支持高质量的...
要实现在Java中添加水印,我们可以利用开源的图像处理库,如Apache Commons Imaging(原名:Sanselan)、ImageMagick的Java绑定(JMagick)或Java Advanced Imaging (JAI)。这里以Apache Commons Imaging为例,因为...
Java AWT提供了基本的图像处理功能,如创建、显示和操作图像,而Java Image I/O库则提供了更高级的读写和处理图片的能力,支持多种图片格式。 1. **Java AWT和Swing**: 这两个库是Java GUI(图形用户界面)的基础,...
此外,还有一些第三方库,如ImageMagick的Java绑定(JMagick)或FreeHEP库,它们提供了更全面的图像处理和压缩功能。这些库不仅可以裁剪图像,还能执行更复杂的操作,如旋转、缩放、颜色空间转换,并且支持多种压缩...
这两个库允许开发者创建图形用户界面,同时也可以用于处理图像。例如,`java.awt.image.BufferedImage` 类用于创建和操作图像对象。 2. **图片裁切**:通过使用`BufferedImage`类,我们可以读取图像并使用`...
这个项目的核心是利用ImageMagick的强大图像处理能力,而ImageMagick在该软件中是通过JMagick这个Java接口进行调用的。JMagick是一个将ImageMagick的功能桥接到Java平台的库,使得开发者可以在Java程序中方便地进行...
另一个文件 "Qrcodeen.jar" 可能是二维码的增强版或者不同实现,而 "jmagick.jar" 是与图像处理相关的库,可能用于将生成的二维码转换为各种图像格式。"Secondcode.java" 和 "TwoDimensionCodeImage.java" 可能是...
在Java中实现动态图片水印功能涉及到多个技术点,包括图像处理、图形绘制、透明度控制和文件操作。通过理解和实践这些知识,你可以创建出满足需求的水印功能,无论是在个人项目还是商业应用中都能发挥重要作用。