java压缩图片大小




package com.xxq.util;
import java.awt.Image;
//旧的jpeg处理类
//import com.sun.image.codec.jpeg.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
import javax.imageio.stream.ImageOutputStream;

import com.sun.imageio.plugins.jpeg.JPEGImageWriter;


/**
*
* @author Administrator
*
*/
public class ImgCompressUtil {

/**
* log4j
*/
private final static Logger logger = Logger.getLogger(ImgCompressUtil.class
.getName());

/**
* 图片压缩测试
*
* @param args
*/
public static void main(String args[]) {
// 图片url,压缩后的宽和高
String url = "D:/111.jpg";
int w = 700;
int h = 500;
//压缩后的图片路径
String newName = MD5Util.MD5(url);
String newDir = "D:/";
String filePath = newDir + newName + "_"
+ w + "_" + h + url.substring(url.indexOf("."));
//压缩
ImgCompress(url,url,w,h);//url,filePath,w,h
}

/**
* 外部调用方法
* @param url
* @param w
* @param h
*/
public static String ImgCompress(String url, String filePath, int w, int h) {
// 压缩质量 百分比
float JPEGcompression = 0.7f;

// 本地图片存储路径
String name = url.substring(url.lastIndexOf("/") + 1);

// 截取url中最后一个“/”之后的字符串为name
logger.info("url:===========" + url);
logger.info("name:=========" + name);

//压缩主方法
return ImgCompress(filePath, url, name, w, h, JPEGcompression);

}

/**
* 图片压缩主方法
*
* @param newDir
* 图片所在的文件夹路径
* @param file
* 图片路径
* @param name
* 图片名
* @param w
* 目标宽
* @param h
* 目标高
* @param JPEGcompression
* 压缩质量/百分比
* @author zhouqz
*/
public static String ImgCompress(String filePath, String url, String name,
int w, int h, float JPEGcompression) {
File file = new File(url);
if (!(file.exists() && file.canRead())) {
filePath = "/var/upload/404.jpg";
}else{
try {
BufferedImage bufferedImage = ImageIO.read(file);

int new_w = w;
int new_h = h;

BufferedImage image_to_save = new BufferedImage(new_w, new_h,
bufferedImage.getType());
image_to_save.getGraphics().drawImage(
bufferedImage.getScaledInstance(new_w, new_h, Image.SCALE_SMOOTH), 0,
0, null);
FileOutputStream fos = new FileOutputStream(filePath); // 输出到文件流

// 旧的使用 jpeg classes进行处理的方法
// JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fos);
// JPEGEncodeParam jep =
// JPEGCodec.getDefaultJPEGEncodeParam(image_to_save);
/* 压缩质量 */
// jep.setQuality(per, true);
// encoder.encode(image_to_save, jep);

// 新的方法
int dpi = 300;//分辨率
saveAsJPEG(dpi, image_to_save, JPEGcompression, fos);
//关闭输出流
fos.close();
//返回压缩后的图片地址
} catch (IOException ex) {
logger.log(Level.SEVERE, null, ex);
filePath = "/var/upload/404.jpg";
}
}

return filePath;

}

/**
* 以JPEG编码保存图片
*
* @param dpi
* 分辨率
* @param image_to_save
* 要处理的图像图片
* @param JPEGcompression
* 压缩比
* @param fos
* 文件输出流
* @throws IOException
*/
public static void saveAsJPEG(Integer dpi, BufferedImage image_to_save,
float JPEGcompression, FileOutputStream fos) throws IOException {

// useful documentation at
// http://docs.oracle.com/javase/7/docs/api/javax/imageio/metadata/doc-files/jpeg_metadata.html
// useful example program at
// http://johnbokma.com/java/obtaining-image-metadata.html to output
// JPEG data

// old jpeg class
// com.sun.image.codec.jpeg.JPEGImageEncoder jpegEncoder =
// com.sun.image.codec.jpeg.JPEGCodec.createJPEGEncoder(fos);
// com.sun.image.codec.jpeg.JPEGEncodeParam jpegEncodeParam =
// jpegEncoder.getDefaultJPEGEncodeParam(image_to_save);

// Image writer
JPEGImageWriter imageWriter = (JPEGImageWriter) ImageIO
.getImageWritersBySuffix("jpg").next();
ImageOutputStream ios = ImageIO.createImageOutputStream(fos);
imageWriter.setOutput(ios);
// and metadata
IIOMetadata imageMetaData = imageWriter.getDefaultImageMetadata(
new ImageTypeSpecifier(image_to_save), null);

// if(dpi != null && !dpi.equals("")){
//
// //old metadata
// //jpegEncodeParam.setDensityUnit(com.sun.image.codec.jpeg.JPEGEncodeParam.DENSITY_UNIT_DOTS_INCH);
// //jpegEncodeParam.setXDensity(dpi);
// //jpegEncodeParam.setYDensity(dpi);
//
// //new metadata
// Element tree = (Element)
// imageMetaData.getAsTree("javax_imageio_jpeg_image_1.0");
// Element jfif =
// (Element)tree.getElementsByTagName("app0JFIF").item(0);
// jfif.setAttribute("Xdensity", Integer.toString(dpi) );
// jfif.setAttribute("Ydensity", Integer.toString(dpi));
//
// }

if (JPEGcompression >= 0 && JPEGcompression <= 1f) {

// old compression
// jpegEncodeParam.setQuality(JPEGcompression,false);

// new Compression
JPEGImageWriteParam jpegParams = (JPEGImageWriteParam) imageWriter
.getDefaultWriteParam();
jpegParams.setCompressionMode(JPEGImageWriteParam.MODE_EXPLICIT);
jpegParams.setCompressionQuality(JPEGcompression);

}

// old write and clean
// jpegEncoder.encode(image_to_save, jpegEncodeParam);

// new Write and clean up
imageWriter.write(imageMetaData,
new IIOImage(image_to_save, null, null), null);
ios.close();
imageWriter.dispose();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值