Рис. 4. Процесс фильтрации Дополнительные эффекты реализуются при наложении изображений друг на друга. Результат наложения зависит от функции смешивания цветов накладывающихся пикселей.
И наконец, еще одним нужным преобразованием является масштабирование изображения. Для этого можно воспользоваться функцией gluScalelmage.
Многие из вышеперечисленных эффектов можно наложить в процессе вывода изображения средствами OpenGL, не изменяя самого изображения в памяти.
/*
Демонстрация применения эффектов к изображению.
Для работы примера необходим файл bmp2 4s.bmp с 24-битным изображением размера 320 на 200.
*/
Fimage fi(320,200,6); // обрабатываемое изображение IMAGE imgl; // изображение из файла float bright=l; // для изменения яркости
float light=0; // для осветления/затемнения
float zoomx=l; // для масштабирования пикселей по х
float zoomy=l; // для масштабирования пикселей по у
int filterind=0; // текущая матрица фильтра float filter[5] [25]= // матрицы фильтров {
{// выделить края 0, 0, 0, 0, 0,
0,-1,-1,-1,0,
0, -1, 8, -1, 0,
0,-1,-1,-1,0,
0, о, о, о, о ),
{// разбиение изображения
1, 0, 0, 0, 1, о, о, о, о, о, о, о, о, о, о, о, о, о, о, о,
1,0,0, 0,1
},
{// смягчение (размытие) изображения
1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1 },
{// горизонтальное размытие 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
2,3,4,5,6, о, о, о, о, о, о, о, о, о, о
}
};
void example_init()
{
gl.set(1);
glClearColor(1, 1, 1, 1) ; glClearColor(1,1,1,1);
// загружаем изображение с диска imgl.loadbmp("bmp24s.bmp");
// копируем в обрабатываемое изображение fi.loadrgb(imgl.inddata, 0,1,2) ; fi.mulrgb(1.0f/255.Of) ; fi.tochrgb(0,1,2,3,4, 5);
}
void example_deinit()
{
gl.deinit() ;
}
void input ()
{
switch(in.vkey)
{
// изменяем яркость case 1Q*: bright+=0.1; break; case 'A1: bright-=0.1; break;
// изменяем осветление case 'W': light+=0.1; break; case 'S': light-=0.1; break;
// изменить масштаб по x и у case 'Е': zoomx+=0.1; break; case 'D': zoomx-=0.1; break; case 'R1: zoomy+=0.1; break; case 'F1: zoomy-=0.1; break;
// зеркальное отражение по x или у case 'X': zoomx=-zoomx; break; case 'С1: zoomy=-zoomy; break;
// негатив case 'Z': bright=-l; light=l; break;
// монохромное изображение case 'В': fi.tomono(); break;
// применение одного из 4 фильтров case VK_F1:case VK_F2: case VK_F3:case VK_F4: fi.filterrgb(3,4,5,0,1,2,
filter[in.vkey-VK_Fl],5,0,0); f i.tochrgb(0,1,2,3,4,5); break;
// вернуться в начальное состояние case VK_SPACE: bright=l; light=0; zoomx=l; zoomy=l; fi.loadrgb(imgl.inddata, 0,1,2); fi.mulrgb(1.Of/255.Of); fi.tochrgb(0,1,2,3,4,5); break; default:;
}
in.vkey=-l;
}
void draw() // вывод сцены
{
input();
glClear(GL_COLOR_BUFFER_BIT);
// изменяем правила пересылки пикселей glPixelTransferf(GL_RED_SCALE,bright); glPixelTransferf(GL_GREEN_SCALE,bright); glPixelTransferf(GL_BLUE_SCALE,bright); glPixelTransferf(GL_RED_BIAS,light); glPixelTransferf(GL_GREEN_BIAS,light); glPixelTransferf(GL_BLUE_BIAS,light);