jmacick生成不同尺寸图片的应用
2011-12-30 16:20
176 查看
为了能使应用分层,首先写了一个javabean,主要是存储图片的基本信息,比如源图片的尺寸和源图片文件,我们这里是要实现多种不同尺寸的图片生成功能,所以我们还需要对要缩放的图片的属性信息进行封装。主要代码如下:
执行后会在fsddfd.jpg所在的目录下生成20111230150153070_big.jpg,20111230150153070_medium.jpg,20111230150153070_small.jpg,
20111230150153070_square.jpg,20111230150153070_thumb.jpg这样的五张不同大小和尺寸的图片。
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这样的五张不同大小和尺寸的图片。
相关文章推荐
- Nginx+PHP实时生成不同尺寸图片
- mvc4 截取上传图片做头像,自动生成不同小尺寸缩略图
- Java实现的不同图片居中剪裁生成同一尺寸缩略图功能示例
- mvc4 截取上传图片做头像,自动生成不同小尺寸缩略图
- python生成不同尺寸的图片
- 批量生成不同尺寸的图片
- thinkphp上传图片并批量生成不同尺寸缩略图
- java实现不同图片居中剪裁生成同一尺寸缩略图
- mvc4 截取上传图片做头像,自动生成不同小尺寸缩略图 (地址)
- Android 仿PhotoShop调色板应用(四) 不同区域颜色选择的颜色生成响应
- graphicsmagick+apache图片请求在线生成规定尺寸图片
- Handler一般处理程序的应用--随机图片生成
- 自适应页面布局使得应用适应不同屏幕的尺寸变得更加容易
- java 程序实现对图片的压缩生成缩略图并可设定长宽、尺寸压缩率、图片质量
- delphi根据不同图片生成不规则窗口的实现(仅限于BMP格式)
- PHP图片自动裁切应付不同尺寸的显示
- HttpHandlerFactory来根据不同的后缀名调用不通的图片生成Handler来生成图片
- Banner 怎么实现轮播不同尺寸的图片
- 自动生成Android不同分辨率下的图片
- 实现不同尺寸图片通屏轮播