1、为什么要使用jmagick,我大概是这么想的,因为jmagick是与服务器本地的ImageMagick配合使用的可以很好的
处理图片较多的项目缩略图缩放问题,还有一些图片编辑功能的扩展。
2、配置
a)下载ImageMagick-6.6.2-9-Q16-windows-dll.exe并安装,安装后系统会自动在环境变量path中添加值
C:\Program Files\ImageMagick-6.6.2-Q16,
b) jmagick.dll文件都拷到C:\WINDOWS\system32下
将文件jmagick.dll 拷到tomcat的bin目录下
将jmagick.jar复制WEB-INF下lib中,
就可以了,看你的情况应该是你的tomcat的环境没有配置好的问题,
再检查下吧
3、API可以参看
http://downloads.jmagick.org/jmagick-doc/
下面举例讲解下代码的实现:
System.setProperty("jmagick.systemclassloader", "no");// 这个没什么好说的,照办就是了
1、压缩图片
//该方法为将图片按比率高清压缩为150*120范围内的缩略图,在上传函数中调用。
//参数:filePath为上传图片的路径,toPath为压缩后图片的路径。
public boolean scale(String filePath, String toPath) throws Exception {
System.setProperty("jmagick.systemclassloader","no");
boolean sf = false;
ImageInfo info = null;
MagickImage image = null;
Dimension imageDim = null;
MagickImage scaled = null;
try {
info = new ImageInfo(filePath);
image = new MagickImage(info);
imageDim = image.getDimension();
float width = imageDim.width;
float height = imageDim.height;
float bl = 1;
float bl_w = width / 150;
float bl_h = height / 120;
if (bl_w >= bl_h) {
bl = bl_w;
}
else {
bl = bl_h;
}
width = width / bl;
height = height / bl;
int new_width = (int) width;
int new_height = (int) height;
scaled = image.scaleImage(new_width, new_height);
scaled.setFileName(toPath);
scaled.writeImage(info);
sf = true;
}
catch (Exception ex) {
sf = false;
}
finally {
if (scaled != null) {
scaled.destroyImages();
}
}
return sf;
}
2、改变背景色
ImageInfo info = null;
MagickImage image = null;
info = new ImageInfo(filePath);
image = new MagickImage(info);
image.setBackgroundColor(PixelPacket.queryColorDatabase("red"));
image.setBorderColor(PixelPacket.queryColorDatabase("green"));
MagickImage borderedImage = image.borderImage(new Rectangle(0, 0, 10,
* 20));
borderedImage.setFileName("D:/image/border.jpg");
borderedImage.writeImage(info);
3、裁剪
Rectangle rect = new Rectangle(0, 0, 80, 40);
rect = new Rectangle(20, 20, 150, 120);
MagickImage cropped = image.cropImage(rect);
cropped.setFileName("D:/image/cropped.jpg");
cropped.writeImage(info);
4、放大缩小
System.setProperty("jmagick.systemclassloader", "no");
ImageInfo info;
info = new ImageInfo(imgPath);
image = new MagickImage(info);
MagickImage scaled = image.zoomImage(toWidth, toHeight);
scaled.setFileName(zoomPath);
scaled.writeImage(info);
5、旋转
System.setProperty("jmagick.systemclassloader", "no");
ImageInfo info = new ImageInfo();
//这里不知道问什么我之前做的时候 用一个参数的构造函数 怎么也没用
image = new MagickImage(info, bytes);
//这里是需要旋转度数的
rotate = image.rotateImage(angle);
//返回一个字节流数组
return rotate.imageToBlob(info);
6、黑白(变灰)
MagickImage image = null;
System.setProperty("jmagick.systemclassloader", "no");
ImageInfo info = new ImageInfo(fromFileStr);
image = new MagickImage(info);
image.imageToBlob(info);
QuantizeInfo quantizeInfo = new QuantizeInfo();
quantizeInfo.setColorspace(ColorspaceType.GRAYColorspace);
image.quantizeImage(quantizeInfo);
image.setFileName(saveToFileStr);
image.writeImage(info);
7、还有很多的效果
// 绘制图片..把文件写在图片上面
MagickImage blankImage = new MagickImage();
byte[] pixels = new byte[200 * 100 * 4];
for (int i = 0; i < 200 * 100; i++) {
pixels[4 * i] = (byte) 255;
pixels[4 * i + 1] = (byte) 255;
pixels[4 * i + 2] = (byte) 255;
pixels[4 * i + 3] = (byte) 0;
}
blankImage.constituteImage(200, 100, "RGBA", pixels);
DrawInfo drawInfo = new DrawInfo(new ImageInfo());
drawInfo.setPrimitive("Rectangle 10 10 190 90"); drawInfo.setStroke(PixelPacket.queryColorDatabase("red"));
drawInfo.setFill(PixelPacket.queryColorDatabase("white"));
blankImage.drawImage(drawInfo);
ImageInfo blankImageInfo = new ImageInfo();
DrawInfo annotateInfo = new
DrawInfo(blankImageInfo);
annotateInfo.setOpacity(0);
annotateInfo.setFont("fixed");
annotateInfo.setFill(PixelPacket.queryColorDatabase("green"));
annotateInfo.setText("Wangxiaochen");
annotateInfo.setGeometry("+30+30");
blankImage.annotateImage(annotateInfo);
blankImage.setFileName("D:/image/blank.jpg");
blankImage.writeImage(info);
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
//透明
blankImage.transparentImage( PixelPacket.queryColorDatabase("white"), 65535);
blankImage.setFileName("D:/image/transparent.png");
blankImage.writeImage(info);
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
// 剪裁
Rectangle rect = new Rectangle(0, 0, 80, 40);
rect = new Rectangle(20, 20, 150, 120);
MagickImage cropped = image.cropImage(rect); cropped.setFileName("D:/image/cropped.jpg");
cropped.writeImage(info);
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
//磨尖
MagickImage sharpened = image.sharpenImage(1.0, 5.0);
sharpened.setFileName("D:/image/sharpened.jpg");
sharpened.writeImage(info);
// Despeckle image
MagickImage despeckled = image.despeckleImage();
despeckled.setFileName("D:/image/despeckled.jpg");
despeckled.writeImage(info);
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
// Convolve image
double[] kernel = new double[9];
for (int i = 0; i < 9; i++) {
kernel[i] = 1.0;
}
kernel[4] = 2.0;
MagickImage convolvedImage = image.convolveImage(3, kernel);
convolvedImage.setFileName("D:/image/convolved.jpg");
convolvedImage.writeImage(info);
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
起作用的都是MagickImage类里的一下方法
blurImage动感摸糊
charcoalImage变成木炭图
edgeImage 尖锐
embossImage 浮雕
flipImage 垂直翻转
flopImage 水平翻转
gaussianBlurImage 朦胧
implodeImage 向内破裂
magnifyImage 放大
medianFilterImage 滤波
minifyImage 缩小
rotateImage(90.0);// 旋转
shearImage(50.0, 10.0);// 缩放
image.scaleImage(100, 80); 修剪
montageImages(new MontageInfo(new ImageInfo())); 为图片加上边框
oilPaintImage 油漆形象
reduceNoiseImage 减少噪音形象
rollImage 摆动
sampleImage 调整宽和高
scaleImage 调整宽和高
spreadImage 图片变散
swirlImage 涡流
unsharpMaskImage 锐化掩模图像
waveImage 为图像加上毛边
zoomImage 变焦