Задачка в общем такая. Есть некий HDC, на котором кто-то рисует. Нам надо на этом HDC вычислить для определенных регионов среднее арифметическое значение цвета.
С графической частью WinAPI я работал мало, нашел функцию GetPixel, но что-то какое-то это топорное решение.
Может быть, кто подскажет, что лучше использовать для этой цели?
Здравствуйте, bober_maniac, Вы писали:
_>Задачка в общем такая. Есть некий HDC, на котором кто-то рисует. Нам надо на этом HDC вычислить для определенных регионов среднее арифметическое значение цвета.
_>С графической частью WinAPI я работал мало, нашел функцию GetPixel, но что-то какое-то это топорное решение.
_>Может быть, кто подскажет, что лучше использовать для этой цели?
1. выделяешь память функцией CreateDIBSection
2. выбираешь её в DC функцией SelectObject
3. рисуешь
4. вызываешь GdiFlush
5. производишь вычисления на выделенной памяти
Здравствуйте, 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 оттуда, если создать изображение в памяти, только как это сделать — ума не приложу.
Здравствуйте, bober_maniac, Вы писали:
_>В принципе, насколько я понимаю, можно сделать BitBlt оттуда, если создать изображение в памяти, только как это сделать — ума не приложу. CreateBitmap?
GetPixel — очень медленная ф-я, но сама по себе вполне рабочая.
Чтобы работало максимально быстро, надо получить/скопировать битмап из DC и работать с пикселами в нем напрямую (каждая строка — массив RGBQUAD или RGBTRIPLE), это на порядки быстрее.
Принцип такой.
Создаем свой compatible DC.
Создаем свой битмап (CreateCompatibleBitmap или CreateDIBSection)
"Селестируем" битмап в свой контекст
Делаем BitBlt из "того" DC в свой.
Все, требуемые пикселы в нашем битмапе.
Если что, это фактически получение скриншота, оно здесь неоднократно обсуждалось с деталями, можно поискать.