Есть ли более быстрая альтернатива GDI GetPixel ()? - PullRequest
8 голосов
/ 21 ноября 2010

Я использую GetPixel() из gdi32.dll в приложении .NET для определения цвета пикселя в любом месте экрана.Он работает нормально, но для меня это является основным узким местом производительности.

Есть ли более быстрый способ сделать это?

Ответы [ 2 ]

10 голосов
/ 21 ноября 2010

Быстрый доступ к пикселям возможен с использованием LockBits() метода Bitmap. Это вернет вам объект, содержащий указатель на начало данных пикселей, и вы можете использовать небезопасный код для доступа к памяти.

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

7 голосов
/ 21 ноября 2010

GetPixel медленно по двум причинам:

  1. Поскольку вы опрашиваете экран - каждый вызов GetPixel приводит к транзакции с видеодрайвером, что, в свою очередь,берет пиксельные данные из видеопамяти.

    В отличие от этого, использование GetPixel на DIBs намного быстрее.

  2. В любом случае GetPixel делает несколько вещей, включая координатыотсечение / преобразования и т. д.

Так что, если вы используете для запроса много значений пикселей одновременно - вы должны попытаться упорядочить это в одной транзакции с драйвером GDI / видео.

Используя GDI, вы должны создать DIB соответствующего размера (см. CreateDIBSection).После создания вы получите прямой указатель на данные битов изображения.Затем скопируйте часть изображения на ваш DIB (см. BitBlt).Также не забудьте вызвать GdiFlush перед тем, как вы фактически проверите содержимое DIB (поскольку видеодрайверы могут выполнять асинхронное рисование).

Используя GD +, вы можете сделать то же самое, с немного более простым синтаксисом.

...