【OpenGL】對像素圖像的一些操作

演示OpenGL對一些像素圖像的操作,包括圖像縮放、倒置、顏色通道分離、純灰度圖和反色,其中11.bmp文件自己找一張圖片命名就行。


#define GLUT_DISABLE_ATEXIT_HACK
#include 
#include 
#include 
#pragma comment(lib,"glaux.lib")


AUX_RGBImageRec* Image;
GLint iWidth,iHeight,iMode=1;
GLubyte* pImage;

void Initialization(void);
void MenuCreate(void);
void OnDisplay(void);
void OnReshape(int,int);
void OnMenu(int);

void main(int argc,char* argv[])
{
	glutInit(&argc,argv);
	glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
	glutInitWindowSize(400,400);
	glutCreateWindow("EXAM703");

	glutCreateMenu(OnMenu);
	glutDisplayFunc(OnDisplay);
	glutReshapeFunc(OnReshape);

	Initialization();
	glutMainLoop();
}

void Initialization(void)
{
	glClearColor(0,0,0,1);

	MenuCreate();

	glPixelStorei(GL_UNPACK_ALIGNMENT,1);
	Image=auxDIBImageLoad("11.bmp");
	iWidth=Image->sizeX;
	iHeight=Image->sizeY;
	pImage=Image->data;
}

void OnDisplay(void)
{
	glClear(GL_COLOR_BUFFER_BIT);

	GLbyte *pModified=NULL;
	GLfloat invert[256];
	GLint i;

	glRasterPos2i(0,0);

	switch(iMode)
	{
	case 2:
		glPixelZoom(-1.0f,-1.0f);
		glRasterPos2i(iWidth-1,iHeight-1);
		break;

	case 3:
		glPixelZoom(0.5f,0.5f);
		break;

	case 4:
		glPixelTransferf(GL_RED_SCALE,1.0f);
		glPixelTransferf(GL_GREEN_SCALE,0.0f);
		glPixelTransferf(GL_BLUE_SCALE,0.0f);
		break;

	case 5:
		glPixelTransferf(GL_RED_SCALE,0.0f);
		glPixelTransferf(GL_GREEN_SCALE,1.0f);
		glPixelTransferf(GL_BLUE_SCALE,0.0f);
		break;

	case 6:
		glPixelTransferf(GL_RED_SCALE,0.0f);
		glPixelTransferf(GL_GREEN_SCALE,0.0f);
		glPixelTransferf(GL_BLUE_SCALE,1.0f);
		break;

	case 7:
		glDrawPixels(iWidth,iHeight,GL_RGB,GL_UNSIGNED_BYTE,pImage);
		pModified=(GLbyte*)new GLbyte[iWidth*iHeight];

		glPixelTransferf(GL_RED_SCALE,0.3f);
		glPixelTransferf(GL_GREEN_SCALE,0.59f);
		glPixelTransferf(GL_BLUE_BITS,0.11f);

		glReadPixels(0,0,iWidth,iHeight,GL_LUMINANCE,GL_UNSIGNED_BYTE,pModified);
		glPixelTransferf(GL_RED_SCALE,1.0f);
		glPixelTransferf(GL_GREEN_SCALE,1.0f);
		glPixelTransferf(GL_BLUE_SCALE,1.0f);
		break;

	case 8:
		invert[0]=1.0f;
		for(i=1;i<256;i++)
			invert[i]=1.0f-(1.0f/255.0f*GLfloat(i));

		glPixelMapfv(GL_PIXEL_MAP_R_TO_R,255,invert);
		glPixelMapfv(GL_PIXEL_MAP_G_TO_G,255,invert);        
		glPixelMapfv(GL_PIXEL_MAP_B_TO_B,255,invert);
		glPixelTransferf(GL_MAP_COLOR,GL_TRUE);
		break;
	case 1:
	default:
		break;

	}

	if(pModified==NULL)
		glDrawPixels(iWidth,iHeight,GL_RGB,GL_UNSIGNED_BYTE,pImage);
	else{
		glDrawPixels(iWidth,iHeight,GL_LUMINANCE,GL_UNSIGNED_BYTE,pModified);
		delete []pModified;
	}

	glPixelTransferi(GL_MAP_COLOR,GL_FALSE);
	glPixelTransferf(GL_RED_SCALE,1.0f);
	glPixelTransferf(GL_GREEN_SCALE,1.0f);
	glPixelTransferf(GL_BLUE_SCALE,1.0f);
	glPixelZoom(1.0f,1.0f);

	glutSwapBuffers();
}

    void OnReshape(int w,int h)
	{
		GLfloat aspectRatio=(GLfloat)w/(GLfloat)h;//計算窗口的縱橫比
		GLfloat winWidth,winHeight;


		glViewport(0,0,w,h);


		glMatrixMode(GL_PROJECTION);
		glLoadIdentity();


		if(w<=h){                               //根據縱橫比計算繪圖區域的寬和高
			winWidth=400;
			winHeight=400*aspectRatio;
		}
		else{
			winWidth=400*aspectRatio;
			winHeight=400;
		}
		gluOrtho2D(0,winWidth,0,winHeight);


		glMatrixMode(GL_MODELVIEW);
		glLoadIdentity();

	}
	
	

	void OnMenu(int value)
	{
		iMode=value;

		glutPostRedisplay();
	}

	void MenuCreate(void)
	{
		glutAddMenuEntry("正常顯示",1);
		glutAddMenuEntry("翻轉圖像",2);
		glutAddMenuEntry("縮小圖像",3);
		glutAddMenuEntry("紅色通道",4);
		glutAddMenuEntry("綠色通道",5);
		glutAddMenuEntry("藍色通道",6);
		glutAddMenuEntry("灰度圖",7);
		glutAddMenuEntry("反轉顏色",8);

		glutAttachMenu(GLUT_RIGHT_BUTTON);

	}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章