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

为了能使应用分层,首先写了一个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这样的五张不同大小和尺寸的图片。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值