演示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);
}