Какой самый быстрый способ поиска пиксельных RGB-данных в C ++? - PullRequest
1 голос
/ 06 февраля 2020

Я хочу посмотреть и сохранить в массиве данные RGB каждого пикселя в квадрате 100 X 100 моего экрана. Я получил эту концепцию, работая с использованием GetPixel () в a для l oop, а затем преобразовывая выходные данные в шестнадцатеричные и сохраняя данные RGB в массиве, но этот метод занимает гораздо больше времени, чем хотелось бы. Какой самый быстрый способ чтения пиксельных RGB-данных с помощью c ++?

1 Ответ

5 голосов
/ 06 февраля 2020

Да, GetPixel и SetPixel - относительно медленные вызовы API. Для управления отдельными пикселями необходимо скопировать содержимое D C (Контекст устройства) во временное растровое изображение, отобразить и определить местоположение пикселя, получить (или установить) его значение цвета, а затем (если цвет пикселя устанавливается) стереть временное растровое изображение обратно в контекст устройства. Как только вы поймете всю работу, которая происходит за кулисами для такой кажущейся простой операции, вы поймете, почему она медленная. Хуже того, накладные расходы должны быть оплачены за каждый вызов * от 1004 * до GetPixel и / или SetPixel, чтобы вы могли понять, почему они обычно не используются для операций рисования.

Подход на замену предполагает использование GetDIBits, который является самым быстрым из возможных способов определения значений нескольких пикселей. Эта функция, по сути, копирует содержимое контекста устройства (D C) во временную независимую от устройства битовую карту (DIB), которую затем можно просматривать или манипулировать по желанию. Определение значения цвета отдельного пикселя становится таким же простым, как индексирование местоположения этого пикселя в памяти. При таком подходе вы можете буквально обрабатывать миллионы пикселей в секунду. Затраты на извлечение значений цвета пикселя оплачиваются только один раз, в самом начале.

Чтобы смоделировать SetPixel, вам нужно будет манипулировать требуемыми значениями пикселей, а затем вызвать SetDIBits, чтобы обновить контекст устройства ( например, экран).

...