Есть ли более быстрая альтернатива GDI GetPixel()?

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

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

2 ответа

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

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


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

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

    В режиме constrast с использованием GetPixel на DIB выполняется намного быстрее.

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

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

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

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

licensed under cc by-sa 3.0 with attribution.