2009-03-14 14 views
11

Necesito tomar una serie de capturas de pantalla y concatenarlas en una película. Estoy tratando de usar la clase java Robot para capturar la pantalla.Java Robot createScreenCapture performance

Pero el método createScreenCapture() lleva más de 1 segundo en mi máquina. Ni siquiera puedo obtener 1 fps. ¿Hay alguna manera de acelerarlo? ¿O hay alguna otra API?

Editar: Se está asignando una imagen de búfer.

BufferedImage image = robot.createScreenCapture (pantalla); // Guarde la captura de pantalla como un jpg
Archivo file = new File ("images/screen" + index + ".jpg");
ImageIO.write (imagen, "jpg", archivo); index ++;

Escribirlo en el archivo jpg tarda unos 200 ms, mientras que obtener BufferedImage toma alrededor de 1400ms.

Respuesta

2

Sugiero ir con C o C++ para esto, tiene mucho más acceso directo al hardware.

Si desea el máximo rendimiento absoluto, vaya al nivel del controlador y simplemente tome los datos directamente de la tarjeta de video. Es difícil encontrar un controlador como este porque podría usarse para derrotar fácilmente cualquier protección de copia, ya que toma los datos como va a la pantalla.

Pero si necesitas quedarte con Java y Robot, ¿estás seguro de que es solo esta llamada a una función que lleva tanto tiempo? No está asignando una Imagen Buffered u otra cosa?

+0

Sí 'createScreenCapture()' asigna una 'BufferedImage', y convierte todos los píxeles al formato 'INT_RGBA', que es lo que toma la mayor parte del tiempo. – finnw

1

Intente experimentar con diferentes configuraciones de pantalla. La profundidad de color lo afectará ya que AWT tiene que convertir todo a un formato de ráster común.

Algunos horarios ejemplo de mi PC:

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

mi adaptador no puede hacer 24bpp o 64 bpp así que no pude probar con esas profundidades, pero yo supongo que requerirían más ciclos de CPU para convertir.