2010-11-21 5 views
7

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

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

+2

Какое применение вам нужно? Возможно, стоит захватить регион на экране, а затем пробовать пиксели из этого. – hometoast

+0

Мое приложение позволяет пользователю выбирать цвета в любом месте экрана (вне моего приложения) в реальном времени. +1 Хорошая идея об ограничении региона: я посмотрю, смогу ли я это сделать. – stucampbell

ответ

8

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

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

+0

Спасибо. Я поддержал это, потому что это полезная статья для некоторых других манипуляций с изображениями, которые я делаю. Но это не помогает мне получить цвет пикселя в любом месте экрана (если только я не сделаю снимок экрана, а это не то, что я хочу). – stucampbell

5

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

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

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

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

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

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

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

+0

Спасибо. Я попробую. – stucampbell

Смежные вопросы