OpenGL: 图像像素操作
2014-03-04 22:45
375 查看
#define GLUT_DISABLE_ATEXIT_HACK #include <Windows.h> #include <stdio.h> #include <gl/glut.h> #include <gl/glaux.h> #pragma comment(lib,"glaux.lib") #pragma comment(lib, "glut32.lib") AUX_RGBImageRec* Image; GLint iWidth,iHeight,iMode=1; GLubyte* pImage; void MenuCreate(void) { glutAddMenuEntry("正常显示", 1); glutAddMenuEntry("翻转图像", 2); glutAddMenuEntry("缩小图像", 3); glutAddMenuEntry("红色通道", 4); glutAddMenuEntry("绿色通道", 5); glutAddMenuEntry("蓝色通道", 6); glutAddMenuEntry(" 灰度图 ", 7); glutAddMenuEntry("反转颜色", 8); glutAttachMenu(GLUT_RIGHT_BUTTON); } 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 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(); }运行结果:
相关文章推荐
- 【OpenGL】对像素图像的一些操作
- android 操作图像像素
- 图像中像素的一些空间操作
- 对图像的单个像素操作
- BGRABitmap图像操作13:标准坐标系统下像素级别例子
- VTK修炼之道19:图像基本操作_图像像素值的访问与修改
- BGRABitmap图像操作4:直接操作像素,使用HSLA colorspace
- opencv学习笔记(01)——操作图像的像素
- opencv2.x中32位图像的像素级操作
- BGRABitmap图像操作4:直接操作像素,颜色校正
- Python-OpenCV 处理图像(三):图像像素点操作
- opencv关于存取图像像素操作的汇总
- OpenGL图像平移、旋转基本操作总结
- 绘图操作时报错“无法从带有索引像素格式的图像创建 Graphics 对象”
- opencv对图像像素进行操作
- 快速对图像的像素进行操作 opencv 实战
- android学习笔记之图像像素操作
- MATLAB图像处理_直接操作像素点进行颜色变换
- OpenCV(二)如何对图像的像素进行操作
- MAT型图像的像素操作