2010-11-21 16 views
7

Estoy usando GetPixel() desde gdi32.dll en una aplicación .NET para muestrear el color de un píxel en cualquier parte de la pantalla. Funciona bien, pero es un cuello de botella de rendimiento importante para mí.¿Existe una alternativa más rápida a GDI GetPixel()?

¿Hay una forma más rápida de hacerlo? son posibles

+2

¿Qué tipo de uso necesitas? Puede valer la pena tomar una región en la pantalla y luego muestrear píxeles de esa. – hometoast

+0

Mi aplicación permite al usuario tomar muestras de color desde cualquier lugar de la pantalla (fuera de mi aplicación) en tiempo real. +1 Buena idea sobre restringir a una región: voy a ver si puedo hacer eso. – stucampbell

Respuesta

8

acceso rápido a los píxeles utilizando LockBits() método de la Bitmap. Esto le devolverá un objeto que contiene un puntero al comienzo de los datos de píxeles y puede usar un código no seguro para acceder a la memoria.

http://www.bobpowell.net/lockingbits.htm

+0

Gracias. He votado porque es un artículo útil para otra manipulación de imágenes que estoy haciendo. Pero no me ayuda a obtener el color de un píxel en ninguna parte de la pantalla (a menos que tome una captura de pantalla primero, que no es lo que quiero). – stucampbell

5

GetPixel es lento por dos razones:

  1. Ya que estás de votación la pantalla - cada llamada a GetPixel conduce a una transacción con el controlador de vídeo, que a su vez lleva el píxel datos de la memoria de video.

    En constraste usando GetPixel en DIB es mucho más rápido.

  2. De todos modos GetPixel realiza varias tareas, incluyendo las coordenadas de recortes/transformaciones y etc.

Así que si usted está utilizando para consultar muchos valores de pixel a la vez - usted debe tratar de arreglar esto en un solo transacción a GDI/controlador de video.

Al usar GDI, debe crear una DIB del tamaño adecuado (consulte CreateDIBSection). Después de la creación, se le dará un puntero directo a los datos de bits de la imagen. Luego copie la parte de la imagen en su DIB (vea BitBlt). Tampoco olvide llamar al GdiFlush antes de comprobar realmente el contenido del DIB (ya que los controladores de video pueden hacer un dibujo asíncrono).

Usando GD +, puede hacer lo mismo, con una sintaxis un poco más simple.

+0

Gracias. Voy a tratar de salir. – stucampbell

Cuestiones relacionadas