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?
-
23-08-2019 - |
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);
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:
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.