2009-03-14 5 views
11

Ho bisogno di prendere una serie di schermate e concatenarle in un film. Sto cercando di usare la classe di robot java per catturare lo schermo.Prestazioni Java Robot createScreenCapture

Ma il metodo createScreenCapture() richiede più di 1 secondo sulla mia macchina. Non riesco nemmeno a ottenere 1 fps. C'è un modo per accelerarlo? O ci sono altre API?

Modifica: assegna un'immagine bufferizzata.

BufferedImage image = robot.createScreenCapture (schermo); // Salva lo screenshot come jpg
File file = nuovo File ("images/screen" + index + ".jpg");
ImageIO.write (immagine, "jpg", file); indice ++;

Scriverlo nel file jpg richiede circa 200 ms dove come ottenere BufferedImage richiede circa 1400 ms.

risposta

2

Suggerirei di andare con C o C++ per questo, ha molto più accesso diretto all'hardware.

Se si desidera ottenere prestazioni massime assolute, passare al livello driver e trasferire i dati direttamente dalla scheda video. È difficile trovare un driver come questo perché potrebbe essere usato per sconfiggere facilmente qualsiasi protezione dalla copia poiché cattura i dati mentre vanno sullo schermo.

Ma se hai bisogno di stare con Java e Robot, sei sicuro che sia solo questa chiamata a una funzione che richiede così tanto tempo? Non sta allocando una BufferedImage o qualcos'altro?

+0

Sì 'createScreenCapture()' assegna un 'BufferedImage' e converte tutti i pixel nel formato' INT_RGBA', che è quello che prende la maggior parte del tempo. – finnw

1

Provare a sperimentare con diverse impostazioni dello schermo. La profondità del colore lo influenzerà in quanto AWT deve convertire tutto in un formato raster comune.

Alcuni esempi di temporizzazioni dal mio PC:

Resolution | Depth | Time taken 
------------+-------+------------ 
1280x1024 | 32 | 215ms 
1280x1024 | 16 | 155ms 
1600x900 | 32 | 235ms 

mio adattatore non può fare 24bpp o 64 bpp quindi ero in grado di testare con quelle profondità, ma direi che avrebbero bisogno di più cicli di CPU per convertire.