2016-07-23 3 views
0

J'essaie de faire une application d'enregistrement d'écran. J'ai un code qui prend une capture d'écran en utilisant java.awt.Robot.createScreenCapture, puis stocke la sortie dans un arraylist. L'arrayliste doit stocker des images . Je dois être en mesure d'accéder à l'un des BufferedImages très rapidement. J'ai essayé de convertir le BufferedImages en byte[] puis de les stocker, mais les convertir en images tamponnées prend trop de temps (environ 1 seconde). Est-ce que je pourrais faire ceci sans devoir ajouter des arguments de ligne de commande?Stockez des milliers de BufferedImages dans ArrayList sans utiliser toute la mémoire - Java

Erreur: 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

Avez-vous fait les calculs? Quelle est la taille d'un écran? Combien de mémoire est réellement disponible pour le tableau? – Mike

+2

Si les images ont la résolution de 1920x1080 et utilisent 4 octets pour chaque pixel, vous devrez fournir 7500x1920x1080 * 4/(1024x1024x1024) = 59,75 Go afin de garder cela dans votre RAM. Alors pourquoi devez-vous garder 7500 images en mémoire? – displayname

+0

J'ai besoin de 7500 images de sorte que si quelque chose arrive sur l'ordinateur, vous pouvez appuyer sur un bouton qui enregistre les 5 dernières minutes de ce qui est arrivé (7500 images) L'écran est 1920 * 1080, et le programme a 1GB de mémoire – Xlsx

Répondre

0

J'ai résolu mon problème! Ce que j'ai fait, c'est que j'ai changé 5 minutes d'enregistrement en 15 secondes, puis j'ai changé le type de BufferedImages en TYPE_BYTE_INDEXED, puis j'ai réduit de moitié les dimensions des images, puis j'ai baissé la fréquence d'images. À l'avenir, je pourrais faire fonctionner ce même programme avec le système de Gilbert Le Blanc (voir le commentaire ci-dessus).