最近工作需要对服务器上面的文件进行压缩,并且把原来一些缩略图进行压缩。贴出代码片断供大家交流。
搜略图实现规定大小画布上缩小图片,方便列表显示。
图片压缩提供了2种方法。1、可以自定义压缩比。2、采用ImageIO进行默认压缩(更安全一些,不会出现内存溢出)。
private void doThumbCompress(File file){
BufferedImage bis=null;
BufferedImage bid=null;
try{
int nw= 113; // 定义宽为113
int nh= 84; // 定义高为84
bis = ImageIO.read(file);
int c_w= bis.getWidth();
int c_h= bis.getHeight();
if(c_w<114 && file.length()<MIN_LENGTH){
bis = null;
return;
}
if(c_w>WIDTH){
nw = WIDTH;
nh = c_h * (WIDTH)/c_w;
c_h=nh;
c_w=nw;
}
if(c_h>HEIGHT){
nh = HEIGHT;
nw = c_w * (HEIGHT)/c_h;
}
bid= new BufferedImage(WIDTH, HEIGHT,BufferedImage.TYPE_INT_RGB);
Graphics g = bid.getGraphics();
g.setColor(Color.white);
g.fillRect(0,0, WIDTH, HEIGHT);
g.drawImage(bis,(WIDTH-nw)/2,0,nw,nh,null);
long oldFileSize=file.length();
if(isOverlay){
ImageIO.write(bid, "jpeg", file);
} else{
ImageIO.write(ImageIO.read(file), "jpeg", new File(outPath
+File.separator+file.getName()));
}
long newFileSize=file.length();
log("ok:"+file+"\t"+oldFileSize+"\t"+newFileSize);
} catch (Exception e){
log(file+" error:"+e.getMessage());
}
bis=null;
bid=null;
}
BufferedImage bis=null;
BufferedImage bid=null;
try{
int nw= 113; // 定义宽为113
int nh= 84; // 定义高为84
bis = ImageIO.read(file);
int c_w= bis.getWidth();
int c_h= bis.getHeight();
if(c_w<114 && file.length()<MIN_LENGTH){
bis = null;
return;
}
if(c_w>WIDTH){
nw = WIDTH;
nh = c_h * (WIDTH)/c_w;
c_h=nh;
c_w=nw;
}
if(c_h>HEIGHT){
nh = HEIGHT;
nw = c_w * (HEIGHT)/c_h;
}
bid= new BufferedImage(WIDTH, HEIGHT,BufferedImage.TYPE_INT_RGB);
Graphics g = bid.getGraphics();
g.setColor(Color.white);
g.fillRect(0,0, WIDTH, HEIGHT);
g.drawImage(bis,(WIDTH-nw)/2,0,nw,nh,null);
long oldFileSize=file.length();
if(isOverlay){
ImageIO.write(bid, "jpeg", file);
} else{
ImageIO.write(ImageIO.read(file), "jpeg", new File(outPath
+File.separator+file.getName()));
}
long newFileSize=file.length();
log("ok:"+file+"\t"+oldFileSize+"\t"+newFileSize);
} catch (Exception e){
log(file+" error:"+e.getMessage());
}
bis=null;
bid=null;
}
压缩图片代码:
/**
* 可以自定义压缩比例
* @param file
*/
private void doCompressQuality(File file) {
BufferedImage src = null;
FileOutputStream out = null;
JPEGImageEncoder encoder = null;
JPEGEncodeParam param = null;
try{
src= ImageIO.read(file);//or png.
if(isOverlay){
out= new FileOutputStream(file);
}else{
out= new FileOutputStream(outPath+File.separator+file.getName());
}
encoder= JPEGCodec.createJPEGEncoder(out);
param= encoder.getDefaultJPEGEncodeParam(src);
param.setQuality(imageQuality, false);
encoder.setJPEGEncodeParam(param);
encoder.encode(src);//近JPEG编码
out.close();
//ImageIO.write(src, "jpeg", new File(outPath+File.separator+file.getName()));
log("over:"+file.getPath());
} catch (IOException e){
log("compress error:"+file.getPath()+";error:"+e.getMessage());
}
out = null;
encoder = null;
param = null;
src = null;
}
/**
* 压缩图片,默认压缩比例75%
* @param file
*/
private void doCompress(File file){
File descFile = null;
boolean writeOk=false;
long fileSize=file.length();
try{
if(isOverlay){
descFile = file;
writeOk = ImageIO.write(ImageIO.read(file), "jpeg", descFile);
}else{
descFile = new File(outPath+File.separator+file.getName());
writeOk = ImageIO.write(ImageIO.read(file), "jpeg", descFile);
}
if(writeOk){
log("ok:"+file.getPath()+"\t"+fileSize+"\t"+descFile.length());
}else{
log("fail:"+file.getPath()+"\t"+fileSize+"\t"+descFile.length());
}
} catch (Exception e){
log("compress error:"+file.getPath()+";descFile="+descFile+";error:"+e.getMessage());
}
descFile=null;
}
* 可以自定义压缩比例
* @param file
*/
private void doCompressQuality(File file) {
BufferedImage src = null;
FileOutputStream out = null;
JPEGImageEncoder encoder = null;
JPEGEncodeParam param = null;
try{
src= ImageIO.read(file);//or png.
if(isOverlay){
out= new FileOutputStream(file);
}else{
out= new FileOutputStream(outPath+File.separator+file.getName());
}
encoder= JPEGCodec.createJPEGEncoder(out);
param= encoder.getDefaultJPEGEncodeParam(src);
param.setQuality(imageQuality, false);
encoder.setJPEGEncodeParam(param);
encoder.encode(src);//近JPEG编码
out.close();
//ImageIO.write(src, "jpeg", new File(outPath+File.separator+file.getName()));
log("over:"+file.getPath());
} catch (IOException e){
log("compress error:"+file.getPath()+";error:"+e.getMessage());
}
out = null;
encoder = null;
param = null;
src = null;
}
/**
* 压缩图片,默认压缩比例75%
* @param file
*/
private void doCompress(File file){
File descFile = null;
boolean writeOk=false;
long fileSize=file.length();
try{
if(isOverlay){
descFile = file;
writeOk = ImageIO.write(ImageIO.read(file), "jpeg", descFile);
}else{
descFile = new File(outPath+File.separator+file.getName());
writeOk = ImageIO.write(ImageIO.read(file), "jpeg", descFile);
}
if(writeOk){
log("ok:"+file.getPath()+"\t"+fileSize+"\t"+descFile.length());
}else{
log("fail:"+file.getPath()+"\t"+fileSize+"\t"+descFile.length());
}
} catch (Exception e){
log("compress error:"+file.getPath()+";descFile="+descFile+";error:"+e.getMessage());
}
descFile=null;
}