package com.zzyy.centerActivities;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.FileImageOutputStream;
import com.zzyy.commonHelper.JDBCHelperV2;public class ImageCompress {
protected ImageWriter imgWrier;
protected ImageWriteParam imgWriteParams;

private int width=450;
private int height=350;
private float quality=1f;////这个值范围为0-1.0,值越小,压缩的越小,当然图片失真越明显
private static ImageCompress compress;


private  ImageCompress() {

}

public static ImageCompress getImageCompress(){
if(null==compress){
compress=new ImageCompress();
}
return compress;
}

public  void compress(File src,File des) {
try {
// 压缩前的JPEG文件

// 压缩前后的JPEG文件
if(!des.exists()){
des.createNewFile();
}

// 压缩百分比
if(des.exists()){
des.delete();
}
Image image = javax.imageio.ImageIO.read(src); 
int width=image.getWidth(null)/3;
int height=image.getHeight(null)/3;
System.out.println("宽度"+width);
System.out.println("高度"+height);
   // BufferedImage tag=new BufferedImage(this.width,this.height ,BufferedImage.TYPE_INT_RGB);
//tag.getGraphics().drawImage(image, 0, 0, this.width, this.width, null); // 绘制缩小后的图
BufferedImage tag=new BufferedImage(width,height ,BufferedImage.TYPE_INT_RGB);
tag.getGraphics().drawImage(image, 0, 0, width, height, null); // 绘制缩小后的图
Iterator it = ImageIO.getImageWritersBySuffix("jpg");
if (it.hasNext()) {
FileImageOutputStream fileImageOutputStream = new FileImageOutputStream(
des);
ImageWriter iw = (ImageWriter) it.next();
ImageWriteParam iwp = iw.getDefaultWriteParam();
iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
iwp.setCompressionQuality(quality);
iw.setOutput(fileImageOutputStream);
iw.write(null, new IIOImage(tag, null, null), iwp);
iw.dispose();
fileImageOutputStream.flush();
fileImageOutputStream.close();
}

image.flush();
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}finally{

}

}

public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public float getQuality() {
return quality;
}
public void setQuality(float quality) {
this.quality = quality;
}

private String sql_babyeAttachmentid = "select attachmentaddr from attachment where   status='1' and attachmenttype = 'hd'";
public ArrayList<ArrayList<String>> getBabyPhotoInfo()
{
ArrayList<ArrayList<String>> returnvalue=null;     Connection connection = null;

try
{
connection = JDBCHelperV2.getConnection();
String sql = sql_babyeAttachmentid;  returnvalue = JDBCHelperV2.executeQuery(sql, connection);
 return returnvalue;
}
catch(SQLException sqle)
{ }
finally
{
try {if (null != connection) connection.close();} catch(SQLException e) {System.out.println(e);}
}
return returnvalue;

}
///测试
public static void main(String args[]){
ImageCompress press =new ImageCompress();
String srcpath="e:/UP/supperBaby/";
String despath="d:/UP/supperBaby/";
ArrayList<ArrayList<String>> retrun =press.getBabyPhotoInfo();
if(retrun.size()>0)
{   for(int i=0;i<=retrun.size() - 1;i++)
{
File src = new File(srcpath+retrun.get(i).get(0)); 
File des = new File(despath+retrun.get(i).get(0));
press.compress(src, des);
System.out.println(srcpath+retrun.get(i).get(0));
}

}

}}
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

解决方案 »

  1.   

    用java处理大量的图片(包括裁剪、等比例压缩、截图)等,出现内存溢出的问题在所难免,即使你将应用服务器的内存调制最大,也应对不了同时处理大量的图片而所而引发的问题。
    较好的图片处理工具,我建议用ImageMagick工具来出来。其性能、功能和处理速度要比其它的好很多。
    因为其借助安装的客户端工具,java中调用接口即可。