/**
* Copyright (c)2010-2011 Enterprise Website Content Management System(EWCMS), All rights reserved.
* EWCMS PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
* http://www.ewcms.com
*/
package com.ewcms.common.io;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.WritableRaster;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import javax.imageio.IIOException;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 图象工具
*
* @author 吴智俊
*/
public class ImageUtil {
private static final Logger logger = LoggerFactory.getLogger(ImageUtil.class);
/**
* 图象压缩
*
* @param sourcePath 源文件名
* @param targetPath 目标文件名
* @param width 压缩宽度
* @param hight 压缩高度
* @return 压缩是否成功
*/
public static Boolean compression(String sourcePath, String targetPath, int width, int hight) {
try{
File sourceFile = new File(sourcePath);
File targetFile = new File(targetPath);
String format = getFormatName(new File(sourcePath));
logger.info("Image Format is {}",format);
BufferedImage srcImage = ImageIO.read(sourceFile);
if (width > 0 || hight > 0) {
srcImage = resize(srcImage, width, hight);
}
ImageIO.write(srcImage, format, targetFile);
}catch(IIOException e){
logger.error("Image IIOException:{}",e);
return false;
}catch(IOException e){
logger.error("Image file IOException:{}",e);
return false;
}
return true;
}
/**
* 图象按比率压缩
*
* @param source 源图象
* @param targetW 目标宽度
* @param targetH 目标长度
* @return BufferedImage
*/
private static BufferedImage resize(BufferedImage source, int targetW, int targetH) {
int type = source.getType();
BufferedImage target = null;
double sx = (double) targetW / source.getWidth();
double sy = (double) targetH / source.getHeight();
if (sx > sy) {
sx = sy;
targetW = (int) (sx * source.getWidth());
} else {
sy = sx;
targetH = (int) (sy * source.getHeight());
}
if (type == BufferedImage.TYPE_CUSTOM) {
ColorModel cm = source.getColorModel();
WritableRaster raster = cm.createCompatibleWritableRaster(targetW, targetH);
boolean alphaPremultiplied = cm.isAlphaPremultiplied();
target = new BufferedImage(cm, raster, alphaPremultiplied, null);
} else
target = new BufferedImage(targetW, targetH, type);
Graphics2D g = target.createGraphics();
g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
g.drawRenderedImage(source, AffineTransform.getScaleInstance(sx, sy));
g.dispose();
return target;
}
/**
* 盘读图片格式
*
* @param file 图片文件
* @return
* @throws IOException
*/
public static String getFormatName(File file) throws IOException {
ImageInputStream iis = ImageIO.createImageInputStream(file);
Iterator<ImageReader> iterator = ImageIO.getImageReaders(iis);
while (iterator.hasNext()) {
ImageReader reader = (ImageReader)iterator.next();
return reader.getFormatName();
}
throw new IOException("It is not image");
}
}