java.lang.OutOfMemoryError做javax.imageio.ImageIO.read时( “文件名”)
问题描述:
我要压缩的 “JPG” 的图像,这是约4M或more.here是我的代码:java.lang.OutOfMemoryError做javax.imageio.ImageIO.read时( “文件名”)
public static void Compress(String sourceFolder,String destFolder,double proportion) throws IOException
{
File source=new File(sourceFolder);
File[] sourceFiles=null;
if(source.isDirectory())
{
sourceFiles=source.listFiles();
for(int i=0;i<sourceFiles.length;i++)
{
String name="";
javax.imageio.ImageIO.setUseCache(false);
Image src = javax.imageio.ImageIO.read(sourceFiles[i]);
name=sourceFiles[i].getName();
int width=src.getWidth(null);
int height=src.getHeight(null);
destWidth=(int) (height*proportion);
destHeight=(int) (width*proportion);
BufferedImage tag=new BufferedImage(destWidth,destHeight,BufferedImage.TYPE_INT_RGB);
Graphics g = tag.getGraphics();
g.drawImage(src, 0, 0, destWidth, destHeight, null);
src.flush();
src=null;
FileOutputStream out = new FileOutputStream(destFolder+"/"+name);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(tag);
out.close();
}
}
else
System.exit(0);
}
当它运行
Image src = javax.imageio.ImageIO.read("filename");
出现异常:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.awt.image.DataBufferByte.<init>(DataBufferByte.java:58)
at java.awt.image.ComponentSampleModel.createDataBuffer(ComponentSampleModel.java:397)
at java.awt.image.Raster.createWritableRaster(Raster.java:938)
at javax.imageio.ImageTypeSpecifier.createBufferedImage(ImageTypeSpecifier.java:1056)
at javax.imageio.ImageReader.getDestination(ImageReader.java:2879)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:943)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:915)
at javax.imageio.ImageIO.read(ImageIO.java:1422)
at javax.imageio.ImageIO.read(ImageIO.java:1282)
at functions.CompressImage.Compress(CompressImage.java:50)
at functions.CompressImage.main(CompressImage.java:24)
我试着运行参数(-Xms = 1G),它仍然无法正常工作! 谁知道解决方案?请帮助我,谢谢!
答
一个4MB JPG将导致一个巨大的BitMap文件。我认为,它只需要很多内存。我在javax.imagio上阅读了大量的内存消耗。
为了得到位图的大小,计算image_X * image_Y *(8至10位* 3(色))
更新 一些数学:
我认为每colorchannel 8位:
7000 * 4900 * 8 * 3 = 1029000000位 = 122MB
我发现,内存中必须有122MB的字节[]。如果操作系统(而不是JVM)无法创建该内存块,则会得到该异常。
+0
图像的分辨率为4900 * 7000 – kerry 2012-07-28 15:25:04
你试过设置-Xmx(最大堆大小)吗? – jtahlborn 2012-07-26 16:28:16
我试过了,还没有工作 – kerry 2012-07-27 12:15:19
有多少图片?或者全部在一起4MB? – JIV 2012-07-27 13:24:03