2016-07-23 43 views
0

我正在嘗試製作屏幕錄製應用程序。我的代碼使用java.awt.Robot.createScreenCapture進行截圖,然後將輸出存儲在數組列表中。數組列表需要存儲圖像。我需要能夠很快訪問任何BufferedImages。我試圖將BufferedImages轉換爲byte[]然後存儲它們,但將它們轉換回bufferedimages需要很長時間(大約1秒)。有沒有辦法可以做到這一點,而無需添加命令行參數?在ArrayList中存儲數千個BufferedImages而不使用所有內存 - Java

錯誤: Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space

代碼:

static ArrayList <BufferedImage> bilist = new ArrayList <BufferedImage>(); 
public static Timer recordingTimer = new Timer (40, new ActionListener() { 

    public void actionPerformed (ActionEvent e) { 

     try { 

      BufferedImage bimage = robot.createScreenCapture(wholescreen); 
      bilist.add(bimage); 
      if (bilist.size() > 7500) bilist.remove(7500); 

     } catch (Exception ex) { 

      ex.printStackTrace(); 

     } 

    } 

}); 
+0

你做過數學嗎?一個屏幕的大小是多少?該陣列實際上有多少內存可用? – Mike

+2

如果圖像的分辨率爲1920x1080,並且每個像素使用4個字節,則必須提供7500x1920x1080 * 4 /(1024x1024 1024)= 59.75 GB,以便將其保存在RAM中。那麼爲什麼你必須在內存中保存7500張圖片呢? – displayname

+0

我需要7500的圖像,這樣如果在電腦上發生了什麼事情,你可以按一個按鈕,保存最後5分鐘發生的事情(7500幀)屏幕是1920 * 1080,程序有1GB的內存 – Xlsx

回答

0

我已經解決了我的問題!我所做的是將5分鐘的錄製時間改爲15秒,然後將BufferedImages的類型更改爲TYPE_BYTE_INDEXED,然後將圖像尺寸減半,然後降低幀速率。將來,我可能會與Gilbert Le Blanc的系統一起製作相同的程序(請參閱上面的評論)。

相關問題