2016-07-23 5 views
0

Ich versuche, eine Bildschirmaufnahme-App zu erstellen. Ich habe Code, der einen Screenshot mit java.awt.Robot.createScreenCapture erstellt und speichert dann die Ausgabe in einer Arraylist. Die Arraylist muss Bilder speichern. Ich muss sehr schnell auf alle BufferedImages zugreifen können. Ich habe versucht, die BufferedImages in byte[] zu konvertieren und sie dann zu speichern, aber sie zu gepufferten Bildern zurück zu konvertieren dauert zu lange (ungefähr 1 Sekunde). Gibt es eine Möglichkeit, dies zu tun, ohne Befehlszeilenargumente hinzufügen zu müssen?Speichern Sie Tausende von BufferedImages in ArrayList, ohne den gesamten Speicher zu belegen - Java

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

Code:

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

Haben Sie die Mathematik gemacht? Was ist die Größe eines Bildschirms? Wie viel Speicher ist tatsächlich für das Array verfügbar? – Mike

+2

Wenn die Bilder eine Auflösung von 1920x1080 haben und 4 Bytes für jedes Pixel benötigen, müssen Sie 7500x1920x1080 * 4/(1024x1024x1024) = 59,75 GB bereitstellen, um das in Ihrem Arbeitsspeicher zu halten. Also warum musst du 7500 Bilder im Speicher behalten? – displayname

+0

Ich brauche 7500 Bilder, so dass, wenn etwas auf dem Computer passiert, können Sie eine Taste drücken, speichert die letzten 5 Minuten, was passiert ist (7500 Frames) Der Bildschirm ist 1920 * 1080, und das Programm verfügt über 1 GB Speicher – Xlsx

Antwort

0

ich mein Problem gelöst! Was ich getan habe, war, dass ich die Aufnahmezeit von 5 Minuten auf 15 Sekunden änderte, dann änderte ich den Typ der BufferedImages zu TYPE_BYTE_INDEXED, dann halbierte ich die Bilddimensionen und dann senkte ich die Bildrate. In Zukunft könnte ich dasselbe Programm mit dem System von Gilbert Le Blanc arbeiten lassen (siehe Kommentar oben).

Verwandte Themen