Работа с содержимым HDC
От: bober_maniac Россия http://bober-maniac.livejournal.com/
Дата: 10.10.10 09:03
Оценка:
Задачка в общем такая. Есть некий HDC, на котором кто-то рисует. Нам надо на этом HDC вычислить для определенных регионов среднее арифметическое значение цвета.

С графической частью WinAPI я работал мало, нашел функцию GetPixel, но что-то какое-то это топорное решение.

Может быть, кто подскажет, что лучше использовать для этой цели?
Re: Работа с содержимым HDC
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 10.10.10 09:29
Оценка:
Здравствуйте, bober_maniac, Вы писали:

_>Задачка в общем такая. Есть некий HDC, на котором кто-то рисует. Нам надо на этом HDC вычислить для определенных регионов среднее арифметическое значение цвета.


_>С графической частью WinAPI я работал мало, нашел функцию GetPixel, но что-то какое-то это топорное решение.


_>Может быть, кто подскажет, что лучше использовать для этой цели?


1. выделяешь память функцией CreateDIBSection
2. выбираешь её в DC функцией SelectObject
3. рисуешь
4. вызываешь GdiFlush
5. производишь вычисления на выделенной памяти
Ce n'est que pour vous dire ce que je vous dis.
Re[2]: Работа с содержимым HDC
От: bober_maniac Россия http://bober-maniac.livejournal.com/
Дата: 10.10.10 11:12
Оценка:
Здравствуйте, Don Reba, Вы писали:

DR>Здравствуйте, bober_maniac, Вы писали:


_>>Задачка в общем такая. Есть некий HDC, на котором кто-то рисует. Нам надо на этом HDC вычислить для определенных регионов среднее арифметическое значение цвета.


_>>С графической частью WinAPI я работал мало, нашел функцию GetPixel, но что-то какое-то это топорное решение.


_>>Может быть, кто подскажет, что лучше использовать для этой цели?


DR>1. выделяешь память функцией CreateDIBSection

DR>2. выбираешь её в DC функцией SelectObject
DR>3. рисуешь
DR>4. вызываешь GdiFlush
DR>5. производишь вычисления на выделенной памяти

Рисую не я, а черте кто, у меня есть только HWND, из которого я с помощью функции GetDC могу получить контекст.

В принципе, насколько я понимаю, можно сделать BitBlt оттуда, если создать изображение в памяти, только как это сделать — ума не приложу.
Re[3]: Работа с содержимым HDC
От: SaZ  
Дата: 10.10.10 12:27
Оценка:
Здравствуйте, bober_maniac, Вы писали:

_>В принципе, насколько я понимаю, можно сделать BitBlt оттуда, если создать изображение в памяти, только как это сделать — ума не приложу.

CreateBitmap?
Re: Работа с содержимым HDC
От: goto Россия  
Дата: 10.10.10 14:21
Оценка:
GetPixel — очень медленная ф-я, но сама по себе вполне рабочая.

Чтобы работало максимально быстро, надо получить/скопировать битмап из DC и работать с пикселами в нем напрямую (каждая строка — массив RGBQUAD или RGBTRIPLE), это на порядки быстрее.

Принцип такой.

Создаем свой compatible DC.
Создаем свой битмап (CreateCompatibleBitmap или CreateDIBSection)
"Селестируем" битмап в свой контекст
Делаем BitBlt из "того" DC в свой.
Все, требуемые пикселы в нашем битмапе.

Если что, это фактически получение скриншота, оно здесь неоднократно обсуждалось с деталями, можно поискать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.