2012-07-26 62 views
0

我要壓縮的 「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),它仍然無法正常工作! 誰知道解決方案?請幫助我,謝謝!

+1

你試過設置-Xmx(最大堆大小)嗎? – jtahlborn 2012-07-26 16:28:16

+0

我試過了,還沒有工作 – kerry 2012-07-27 12:15:19

+0

有多少圖片?或者全部在一起4MB? – JIV 2012-07-27 13:24:03

回答

0

您需要獲取堆轉儲並分析它。所以最簡單的方法是添加JVM PARAMS像

-XX:+HeapDumpOnOutOfMemoryError 

這將自動創建堆轉儲/之後你可以分析一下使用Java分析器(yourkit,JProfiler的,等等)是錯的

+0

我試過了,還沒有工作 – kerry 2012-07-27 12:16:47

+1

做過堆轉儲的應用嗎? – 2012-07-27 12:40:39

+0

我粘貼了我的密碼。 – kerry 2012-07-27 13:19:29

0

一個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

相關問題