Sto scrivendo un modulo di cattura dello schermo in Java, ma sto avendo seri problemi di prestazioni che scrivono le immagini su disco. Cos'altro posso fare?

StackOverflow https://stackoverflow.com/questions/1087891

Domanda

Sto scrivendo un modulo di cattura dello schermo utilizzando la classe Robot. Sto prendendo screenshot dell'applicazione ogni x millisecondi e scrittura su disco. Dopo la cattura dello schermo è finito, sto compilando le schermate a video con ffmpeg.

Tuttavia, a scrivere le immagini su disco è estremamente lento e macina la mia domanda di una battuta d'arresto. Che cosa mi manca? C'è un modo migliore per scrivere un semplice modulo di cattura dello schermo?

Edit: Ho provato diversi modi di scrivere le immagini su disco, e tutti sono molto lento. Sono stato attaccare con il seguente, grazie alla sua semplicità di utilizzo:

ImageIO.write(bufferedImage ,"jpg", file);
È stato utile?

Soluzione

o codificare l'immagine in formato video destra quando si cattura l'immagine, e di evitare la scrittura del file temporaneo di grandi dimensioni a tutti. codice completo usando Xuggler può essere trovato qui:

Xuggler Screen Capture Demo Codice

Altri suggerimenti

Prova a mettere la vostra scrittura in un nuovo thread in modo da non dover aspettare per lenta IO disco.

ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(10);
executor.schedule(new Runnable(){
    @Override
     public void run() {
            writeImageHere(bufferedImage, file);
     }                  
}

Basta guardare fuori per problemi di concorrenza.

La seconda soluzione (intensivo di memoria) è al buffer tuoi jpgs e tenerli tutti in memoria e scrivere solo quando una certa quantità di tempo è passato o il programma termina.

L'immagine predefinita tamponata è abbastanza grande. Prova averlo come un formato più piccolo e poi scriverlo.

Ho usato .png prima ed è abbastanza piccolo.

Inserisci un po 'più di codice e vedremo cosa altra cosa può essere sbagliato nella vostra.

Modifica

Io uso questo:

        BufferedImage bufferedImage  = new BufferedImage(
                                              widthFromRobot, 
                                              heightFromRobot,
                                              BufferedImage.    TYPE_3BYTE_BGR );

        bufferedImage.getGraphics().drawImage( fromRobotScreenCapture, 0,0, null );

       // get a file name 
       ImageIO.write( bufferedImage, "png", someFile  );

Crea una nuova immagine con lo stesso Larghezza e Altezza , ma un diverso tipi di immagine .

Scrivi l'immagine in quella nuova immagine, e salvare quella nuova immagine su disco.

Esplora i diversi valori tipo di immagine e vedere quale è meglio per voi. Naturalmente ci potrebbe essere un compromesso tra qualità e velocità. (Credo comunque il problema è altrove, ma provo questo primo)

Scopri la risposta 6 del presente distacco . Ciò implica che l'uso di JAI migliorerà le prestazioni in scrittura.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top