您的位置:首页 > 其它

jmacick生成不同尺寸图片的应用

2011-12-30 16:20 176 查看
为了能使应用分层,首先写了一个javabean,主要是存储图片的基本信息,比如源图片的尺寸和源图片文件,我们这里是要实现多种不同尺寸的图片生成功能,所以我们还需要对要缩放的图片的属性信息进行封装。主要代码如下:

public class ImageCompressInfo {

/** 源图片的尺寸。 */
private Dimension srcDim;

/** 源图片文件。 */
private File srcImage;

/** 大图片文件。 */
private File bigImage;

/** 中型图片文件。 */
private File mediumImage;

/** 小型图片文件。 */
private File smallImage;

/** 缩略图片文件。 */
private File thumbImage;

/** 方块图片文件。 */
private File squareImage;

//省略getter和setter方法
public class ImageCompressSetting implements Serializable {

private static final long      serialVersionUID    = 1L;

/* 默认的 ImageCompressSetting实例。 */
static final ImageCompressSetting DEFALUT_INSTANCE    = new ImageCompressSetting();

/** 大图文件的默认后缀。 */
public static final String     BIG_IMAGE_SUFFIX    = "_big.jpg";

/** 中图文件的默认后缀。 */
public static final String     MEDIUM_IMAGE_SUFFIX = "_medium.jpg";

/** 小图文件的默认后缀。 */
public static final String     SMALL_IMAGE_SUFFIX  = "_small.jpg";

/** 缩略图文件的默认后缀。 */
public static final String     THUMB_IMAGE_SUFFIX  = "_thumb.jpg";

/** 方块图文件的默认后缀。 */
public static final String     SQUARE_IMAGE_SUFFIX = "_square.jpg";

/* 大图片路径。 */
private String                 bigImage;

/* 中型图片路径。 */
private String                 mediumImage;

/* 生成的小图片路径。 */
private String                 smallImage;

/* 生成的缩略图路径。 */
private String                 thumbImage;

/* 生成的方块图路径。 */
private String                 squareImage;

/**
* 返回默认的 {@code ImageCompressSetting} 实例。
*
* @return 默认的 {@code ImageCompressSetting} 实例。
*/
public static ImageCompressSetting getDefaultInstance() {
return DEFALUT_INSTANCE;
}

/**
* 构造一个新的 {@code ImageCompressSetting} 实例。
*/
public ImageCompressSetting() {
super();
}

/**
* @param big 大图片的最大宽度或高度。
* @param medium 中型图片的最大宽度或高度。
* @param small 小图片的最大宽度或高度。
* @param thumb 缩略图的最大宽度或高度。
* @param square 方块图的边长。
*/
public ImageScaleSetting(int big, int medium, int small, int thumb, int square) {
this.bigImageSide = big;
this.mediumImageSide = medium;
this.smallImageSide = small;
this.thumbImageSide = thumb;
this.squareImageSide = square;
}

//getter和setter方法省略
}
有了这两个类之后,我们只需要对ImageCompressSetting中的各个属性使用jmagick来进行设置并且返回ImageCompressInfo实例就行了。这时我们定义一个接口,这个接口主要用于处理图片缩放、加水印图片、加水印文字、切图等操作:

public interface ImageProcessor {

public ImageCompressInfo compressImages(File srcImage, ImageCompressSetting compressSide) throws Exception;
}
下面我们写一个实现此接口的类,用来实际处理一张现成的图片并生成不同大小的图片。

public class ImageProcessorImpl implements ImageProcessor {

static {
System.setProperty("jmagick.systemclassloader", "no");//这句代码很重要,不能少,原因看上一篇文章
}
public ImageCompressInfo compressImages(File srcImage, ImageCompressSetting compressSetting)
throws Exception {
if(srcImage.exists()) {
if(srcImage.isDirectory()) {
throw new Exception(srcImage + " 存在,但它不是一个图片文件!");
}
} else {
throw new Exception("图片文件 " + srcImage + " 不存在!");
}
if(compressSetting == null) {
compressSetting = ImageCompressSetting.getDefaultInstance();
// 未设置缩放设置信息,则保存在当前源图片所在目录下
String srcImageDir = srcImage.getAbsoluteFile().getParent();
String fileName = srcImageDir + File.separator + DateUtils.format("yyyyMMddHHmmssSSS");
scaleSetting.setBigImage(fileName + ImageCompressSetting.BIG_IMAGE_SUFFIX);
scaleSetting.setMediumImage(fileName + ImageCompressSetting.MEDIUM_IMAGE_SUFFIX);
scaleSetting.setSmallImage(fileName + ImageCompressSetting.SMALL_IMAGE_SUFFIX);
scaleSetting.setThumbImage(fileName + ImageCompressSetting.THUMB_IMAGE_SUFFIX);
scaleSetting.setSquareImage(fileName + ImageCompressSetting.SQUARE_IMAGE_SUFFIX);
}
ImageInfo imageInfo = null;
MagickImage image = null;
Dimension srcDim = null;
try {
imageInfo = new ImageInfo(srcImage.getAbsolutePath());
imageInfo.setQuality(100);
image = new MagickImage(imageInfo);
srcDim = image.getDimension();

if(StringUtils.hasText(compressSetting.getBigImage())) {//StringUtils类时自己封装的,这个类没有什么特别之处
Dimension bigDim = calculateCompress(srcDim, compressSetting.getBigImageSide());
MagickImage bigImage = image.scaleImage((int)bigDim.getWidth(), (int)bigDim.getHeight());
bigImage.setFileName(compressSetting.getBigImage());
bigImage.writeImage(imageInfo);
}
if(StringUtils.hasText(compressSetting.getMediumImage())) {
Dimension mediumDim = calculateCompress(srcDim, compressSetting.getMediumImageSide());
MagickImage mediumImage = image.scaleImage((int)mediumDim.getWidth(), (int)mediumDim.getHeight());
mediumImage.setFileName(compressSetting.getMediumImage());
mediumImage.writeImage(imageInfo);
}
if(StringUtils.hasText(compressSetting.getSmallImage())) {
Dimension smallDim = calculateCompress(srcDim,compressSetting.getSmallImageSide());
MagickImage smallImage = image.scaleImage((int)smallDim.getWidth(), (int)smallDim.getHeight());
smallImage.setFileName(compressSetting.getSmallImage());
smallImage.writeImage(imageInfo);
}
if(StringUtils.hasText(compressSetting.getThumbImage())) {
Dimension thumbDim = calculateCompress(srcDim, compressSetting.getThumbImageSide());
MagickImage thumbImage = image.scaleImage((int)thumbDim.getWidth(), (int)thumbDim.getHeight());
thumbImage.setFileName(compressSetting.getThumbImage());
thumbImage.writeImage(imageInfo);
}
if(StringUtils.hasText(compressSetting.getSquareImage())) {
Dimension squareDim = calculateCompress(srcDim, compressSetting.getSquareImageSide());
MagickImage squareImage = image.scaleImage((int)squareDim.getWidth(), (int)squareDim.getHeight());
squareImage.setFileName(compressSetting.getSquareImage());
squareImage.writeImage(imageInfo);
}
} catch(Exception ex) {

}
return null;
}

private Dimension calculateCompress(Dimension dim, int side) {
double w = dim.getWidth();
double h = dim.getHeight();
if(w >= h) { // 横向图片
if(w <= side) {
return new Dimension(dim);
} else {
h = h * side / w;
return new Dimension(side, (int)h);
}
} else { // 纵向图片
if(h <= side) {
return new Dimension(dim);
} else {
w = w * side / h;
return new Dimension((int)w, side);
}
}
}

public static void main(String[] args) throws Exception {
ImageProcessorImpl processor = new ImageProcessorImpl();
processor.compressImages(new File("E:\\fsddfd.jpg"), null);
}
}

执行后会在fsddfd.jpg所在的目录下生成20111230150153070_big.jpg,20111230150153070_medium.jpg,20111230150153070_small.jpg,

20111230150153070_square.jpg,20111230150153070_thumb.jpg这样的五张不同大小和尺寸的图片。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息