Процесс фильтрации

Рис. 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);


⇐ вернуться назад | | далее ⇒