现在介绍使用Jmagick的使用,可以生成质量很好的缩略图,当然还有其他很多图像处理的方法。
首先jmagick(http://www.yeo.id.au/jmagick/)是ImageMagick(http: //www.imagemagick.org/)的java 应用的接口。所以要先安装ImageMagick应用程序,你的java应用才能使用,在主页上你可以轻松找到下载的链接。
1。下载jmagick,imagemagick
2.安装ImageMagick,网站上有安装方法(windows,unnix),我只在win上做了安装,安装以后把安装目录下所有的dll文件copy到windows/system32/目录下。
3。下载的jmagick包含jmagick.jar,jmagick.dll文件,jmagick.dll需要copy到windows/system32/目录下。
4。web应用如果部署到tomcat下,那么最好在catalina.bat文件中改变如下设置
set JAVA_OPTS=%JAVA_OPTS% -Xms256M -Xmx768M -XX:MaxPermSize=128M -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file="${catalina.base}/conf/logging.properties"
避免heap溢出的问题,参数看你自己的机器而定。( -Xms256M -Xmx768M -XX:MaxPermSize=128M )
5。还要注意如果部署到web应用,你在使用的class里面需要
System.setProperty("jmagick.systemclassloader","no");
要不然会报出UnsatisfiedLinkError: no JMagick injava.library.path.
例子:
import magick.CompressionType;
import magick.ImageInfo;
import magick.MagickException;
import magick.MagickImage;
import magick.PreviewType;
import java.awt.Rectangle;
public class ImgTools {
private int width = 1;
private int height = 1;
private ImageInfo info;
public static int HEAD_SIZE = 48;
public static int ICON_SIZE = 66;
private static int SMALL_SIZE = 120;
public static int LARGE_SIZE = 320;
public static int HUGE_SIZE = 500;
public ImgTools(int width, int height, String oldFileName) {
try {
System.setProperty("jmagick.systemclassloader","no");
info = new ImageInfo(oldFileName);
info.setCompression(CompressionType.JPEGCompression);
info.setPreviewType(PreviewType.JPEGPreview);
this.width = width;
this.height = height;
} catch (MagickException e) {
System.out.println("MagickException in Upload Photo");
e.printStackTrace();
}
}
//120*120的图片
public void MakeSmallByJMagick(String newFileName) {
try {
info.setQuality(90);
MagickImage image = new MagickImage(info);
image.profileImage("*", null);
MagickImage scaled = null;
double proportion = 0;
if (width == height) {
scaled = image.scaleImage(SMALL_SIZE, SMALL_SIZE);// 小图片文件的大小.
} else {
if (width > height) {
if (width > SMALL_SIZE) {
proportion = (double)SMALL_SIZE / width;
} else {
proportion = width / (double)SMALL_SIZE;
}
scaled = image.scaleImage(SMALL_SIZE, (int) (height * proportion));// 小图片文件的大小.
} else {
if (height > SMALL_SIZE) {
proportion = (double)SMALL_SIZE / height;
} else {
proportion = height / (double)SMALL_SIZE;
}
scaled = image.scaleImage((int) (width * proportion),SMALL_SIZE);// 小图片文件的大小.
}
}
scaled.setFileName(newFileName);
scaled.writeImage(info);
} catch (MagickException e) {
System.out.println("MagickException in Upload Photo");
e.printStackTrace();
}
}
//320*320和500*500的图片
public void MakeBigByJMagick(String newFileName,int size){
try {
info.setQuality(90);
MagickImage image = new MagickImage(info);
image.profileImage("*", null);
MagickImage scaled = null;
double proportion = 0;
if (width == height) {
if (width > size) {
proportion = (double)size / width;
scaled = image.scaleImage((int) (width * proportion), (int) (width * proportion));
} else {
scaled = image.scaleImage(width, height);
}
} else {
if (width > height) {
if (width > size) {
proportion = (double)size / width;
scaled = image.scaleImage(size, (int) (height * proportion));
} else {
scaled = image.scaleImage(width, height);
}
} else {
if (height > size) {
proportion = (double)size / height;
scaled = image.scaleImage((int) (width * proportion), size);
} else {
scaled = image.scaleImage(width, height);
}
}
}
scaled.setFileName(newFileName);
scaled.writeImage(info);
} catch (MagickException e) {
e.printStackTrace();
System.out.println("MagickException in Upload Photo");
}
}
//66*66和48*48的图片
public void MakeLittleByJMagick(String newFileName,int size) {
Rectangle rect = null;
if(width < size && height < size){
rect = new Rectangle(0,0,size,size);
}else if(width < size || height < size){
rect = new Rectangle(0,0,size,size);
}else{
if(width < height){
int beginPoint = (height - width) / 2 ;
rect = new Rectangle(0,beginPoint,width,width);
}else{
int beginPoint = (width - height) / 2 ;
rect = new Rectangle(beginPoint,0,height,height);
}
}
try {
info.setQuality(85);
MagickImage image = new MagickImage(info);
image.profileImage("*", null);
MagickImage cropped = image.cropImage(rect).scaleImage(size,size);
cropped.setFileName(newFileName);
cropped.writeImage(info);
} catch (MagickException e) {
System.out.println("MagickException in Upload Photo");
e.printStackTrace();
}
}
}