Страница 1 из 1

Вывод оттенков серого в MFC

Добавлено: 26 фев 2005, 18:00
usualman
Пожалуйста, посоветуйте, как добиться, чтобы в моём классе, производном от CWnd, рисовались изображения в оттенках серого, а не цветные. Мне кажется, я всё сделал, как в хелпе написано, причём простейшим способом, вроде должно всё работать, но не работает. Вот моя функция, которая рисует:

void CProjParWnd::OnPaint()
{
CPaintDC dc(this);
CPalette* oldPal;
oldPal=dc.SelectPalette(&m_Palette, TRUE);
dc.RealizePalette();
RECT Rect;
GetClientRect(&Rect);
dc.BitBlt(0,0,Rect.right,Rect.bottom, m_pSrcDC, 0,0, SRCCOPY);
dc.SelectPalette(oldPal, TRUE);
}

В этой функции:
m_Palette - объект класса CPalette, палитра с оттенками серого, ранее созданная.
m_pSrcDC - указатель на контекст изображения, оно в объекте, производном от CImage.

Изображение действительно рисуется, такое как надо (можно узнать), но цветное, т.е. цветными разводами. Значит, палитра почему-то не выбралась. В чём моя ошибка? Хотелось бы вообще понимать этот механизм, у меня есть готовые функции по выводу серых изображений, но там всё очень сложно и совсем непонятно, вставлять в свою программу не понимая что - это, мне кажется, неправильно. Помогите, пожалуйста, разобраться!

Добавлено: 26 фев 2005, 19:26
Styopa
Если окно небольшое, то можно в этом битмапе циклично перебирать RGBQUAD и их компоненты усреднять: (r + g + b) / 3. Если умеешь, можно ускорить вставкой ассемблера. ХБитмап получаешь так: hYourBMP = dc.SelectObject(hNewBMP);
Потом берешь пиксельный массив функцией GetBitmapBits(). В MSDN они описаны, читай.
Но это будет кошмарно долго...

Добавлено: 26 фев 2005, 22:29
usualman
Уважаемый(ая) Styopa, у меня 16-битное изображение в оттенках серого.

Добавлено: 27 фев 2005, 00:14
Styopa
Понял. В чем проблема, если изображения и так серые?! :shock: На фига тебе палитра тогда? Заготовленные изображения Фотошопом или еще чем конвертируй в 24 бит и НИКАКИХ проблем не будет. Если драйвер монитора не кривой. А еще можно с экрана пыль вытереть... :D

Добавлено: 27 фев 2005, 00:31
usualman
Уважаемый Styopa, а я пока что Вас не понял. Не могли бы Вы мне написать по пунктам ВСЕ необходимые шаги, коротые должна выполнять моя программа, чтобы вывести в окне массив из 16-битных пикселов в виде полутонового серого изображения? Все операции, касающиеся этого массива и окна?