Первая картинка связывается с hdcMemS, вторая - с hdcMemD. При обработке изображения в цикле по строкам и столбцам картинки для каждой точки выполняются действия, перечисленные в следующем списке:
1. Код цвета читается функцией Cvet = GetPixel (hdcMemS. i, j).
2. Цвет разделяется на компоненты, которые умножаются на коэффициенты, определяющие степень проявления картинки.
Работа с растровыми изображениями
3. Результаты умножения ограничиваются диапазоном (0, 255).
4. Из составляющих цвета формируется общий код, который заносится в обработанную картинку функцией Set Pi xel V().
Код обработки и отображения картинки приведен в листинге 17.4.
Листинг 17.4
void GDIBitMapCHDC hdcMemS.HDC hdcMemD.
double kB. double kG.double kR. int x.int y)
{
int Cvet; //Общий цвет.
C0L0RREF R.G.B; //Компоненты цвета.
//Для организации перебора точек функции нужны высота и ширина картинки. //Эта информация получается из дескриптора битовой карты. Чтобы не вводить //дополнительных параметров и глобальных переменных, дескриптор извлекается //из контекста
HBITMAP BitMapS - (HBITMAP)GetCurrentObject(hdcMemS.OBJ_BITMAP): //Полученный дескриптор BitMapS позволяет занести требуемые данные //в структуру BITMAP BITMAP bitmap;
GetObject(Bi tMapS.s i zeof(ВITMAP).&bi tmap):
for(int i - 0:i<bitmap.bmWidth;i++) //Вложенным циклом по строкам и столбцам for(int j - 0;j<bitmap.bmHeight://просматриваются все точки картинки {
Cvet - GetPixel(hdcMemS.i.j); //Общий цвет.
R - (int)((Cvet&OxFF)*kR); //Красная составляющая.
R - R<256?R>0?R:0:255; //Ограничение R диапазоном (0.255)
G - (int)((Cvet&0xFF00)*kG):
G - G<0xl0000?G>0xFF?G&0xFF00:0:0xFF00;
В - (int)((Cvet&0xFF0000)*kB): В - B<0xl000000?B&0xFF0000:OxFFOOOO: //Зеленый G и синий В компоненты цвета умножаются и ограничиваются без //сдвига в младший байт
Cvet-R|G|В: Объединение трех компонентов в результирующий цвет. // if(!Cvet)Cvet - OxFFFFFF; Демонстрационная картинка была изображена //на черном фоне. Данный оператор превращает черный фон в белый для //отображения в печатном виде