import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.imageio.ImageIO;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
public class ImageUtil {
public static int ORIGINAL_BANK_IMAGE = 1;//原始图
public static int THUMBNAIL_BANK_IMAGE = 2;//缩略图
/**
*
* @param src 将要压缩的图片
* @param destFileName 压缩后的文件名
* @param width 高度
* @param height 宽度
* @param quality 压缩清晰度 建议为1.0
* @param percentage 是否等比压缩 若true宽高比率将将自动调整
* @return
*/
public static File compress(File src, String destFileName, int width, int height,
float quality, boolean percentage) {
try {
Image srcImage = ImageIO.read(src);
if (percentage) {
// 为等比缩放计算输出的图片宽度及高度
double rate1 = ((double) srcImage.getWidth(null))
/ (double) width + 0.1;
double rate2 = ((double) srcImage.getHeight(null))
/ (double) height + 0.1;
double rate = rate1 > rate2 ? rate1 : rate2;
width = (int) (((double) srcImage.getWidth(null)) / rate);
height = (int) (((double) srcImage.getHeight(null)) / rate);
}
/* 宽高设定 */
BufferedImage bufImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
bufImg.getGraphics().drawImage(srcImage, 0, 0, width, height, null);
/* 压缩之后临时存放位置 */
File file = new File(destFileName);
FileOutputStream fout = new FileOutputStream(file);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fout);
JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(bufImg);
/* 压缩质量 */
jep.setQuality(quality, true);
encoder.encode(bufImg, jep);
fout.close();
srcImage.flush();
return file;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
/**
*
* @param in
* @param width 高度
* @param height 宽度
* @param quality 压缩清晰度 建议为1.0
* @param percentage 是否等比压缩 若true宽高比率将将自动调整
* @return
*/
public static ByteArrayOutputStream compress(InputStream in, int width, int height, float quality, boolean percentage) {
ByteArrayOutputStream out = null;
try {
Image srcImage = ImageIO.read(in);
if (percentage) {
// 为等比缩放计算输出的图片宽度及高度
double rate1 = ((double) srcImage.getWidth(null))
/ (double) width + 0.1;
double rate2 = ((double) srcImage.getHeight(null))
/ (double) height + 0.1;
double rate = rate1 > rate2 ? rate1 : rate2;
width = (int) (((double) srcImage.getWidth(null)) / rate);
height = (int) (((double) srcImage.getHeight(null)) / rate);
}
/* 宽高设定 */
BufferedImage bufImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
bufImg.getGraphics().drawImage(srcImage, 0, 0, width, height, null);
out = new ByteArrayOutputStream();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(bufImg);
/* 压缩质量 */
jep.setQuality(quality, true);
encoder.encode(bufImg, jep);
srcImage.flush();
} catch (IOException e) {
e.printStackTrace();
}
return out;
}
public static ByteArrayOutputStream compress(InputStream in, int width, int height) {
return compress(in, width, height, 1.0f, true);
}
public static void main(String[] args) throws Exception {
File src = new File("d:/Image.jpg");
compress(src, "d:/bbb.jpg", 160, 120, 1.0f, true);
FileInputStream fis = new FileInputStream(src);
ByteArrayOutputStream out = (ByteArrayOutputStream) compress(fis, 160, 120, 1.0f, true);
FileOutputStream fout = new FileOutputStream(new File("d:/aaa.jpg"));
out.writeTo(fout);
fout.close();
}
}