【OpenGL】对像素图像的一些操作
2017-01-04 18:24
337 查看
演示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); }
相关文章推荐
- OpenGL: 图像像素操作
- 图像中像素的一些空间操作
- OpenGL BMP文件与像素操作
- C#中Bitmap类实现对图像操作的一些方法
- C#中Bitmap类实现对图像操作的一些方法
- C#中Bitmap类实现对图像操作的一些方法
- OpenGL像素操作
- 【转】C#中Bitmap类实现对图像操作的一些方法
- OpenGL入门学习[十]OpenGL的像素操作、BMP文件
- Android游戏Graphics绘图之图像像素操作
- C# 操作图像像素 变灰 画图
- Opencv2 中 Mat 关于图像像素的操作
- 快速图像像素操作
- OpenGL像素操作
- OpenGL学习笔记(14)像素操作
- 我的OpenCV学习笔记(三):利用操作像素完成简单的图像处理:加入椒盐噪声、图像翻转、改变对比度、图像锐化
- android 操作图像像素
- 快速图像像素操作
- OpenGL中的像素操作
- 访问图像像素的一些方法