¿Existe una alternativa más rápida a GDI GetPixel ()?

Estoy usando GetPixel() desde gdi32.dll en una aplicación .NET para muestrear el color de un píxel en cualquier lugar de la pantalla. Funciona bien, pero es un cuello de botella de rendimiento importante para mí.

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

El acceso rápido a píxeles es posible utilizando el método LockBits() del Bitmap de 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

GetPixel es lento por dos razones:

  1. Como está sondeando la pantalla, cada llamada a GetPixel lleva a una transacción con el controlador de video, que a su vez toma los datos de píxel de la memoria de video.

    En contraste, usar GetPixel en DIB es mucho más rápido.

  2. De GetPixel modos, GetPixel hace varias cosas, incluyendo recortes de coordenadas / transformaciones, etc.

De modo que si está utilizando para consultar muchos valores de píxeles a la vez, debe intentar organizar esto en una sola transacción en el controlador de GDI / video.

Con GDI debe crear un 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 ). Además, no olvide llamar a GdiFlush antes de que realmente compruebe el contenido de la DIB (ya que los controladores de video pueden hacer un dibujo asincrónico).

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