OpenGL:将绘制场景保存为bmp图片,方便出图
void ScreenShot() { GLint pView[4]; glGetIntegerv(GL_VIEWPORT,pView);//得到视图矩阵,pView[2]为宽即width,pView[3]为高即height GLsizei numComponet = 3; GLsizei bufferSize = pView[2]*pView[3]*sizeof(GLfloat)*numComponet; GLfloat* _data = new GLfloat[bufferSize]; unsigned char* data = new unsigned char[bufferSize]; glPixelStorei(GL_UNPACK_ALIGNMENT, 4);//设置4字节对齐 glReadBuffer(GL_FRONT); glReadPixels(pView[0],pView[1],pView[2],pView[3],GL_BGR_EXT,GL_FLOAT,_data);//不是GL_RGB的读取方式,而是GL_BGR或者GL_BGR_Ext glReadBuffer(GL_BACK); for (int i = 0 ; i <bufferSize ; i ++) { data[i] = _data[i]*255; } BITMAPFILEHEADER fileHeader; BITMAPINFOHEADER infoHeader; infoHeader.biSize = 40; infoHeader.biWidth = width; infoHeader.biHeight = height; infoHeader.biPlanes = 1; infoHeader.biBitCount = 24; infoHeader.biCompression = BI_RGB; infoHeader.biSizeImage =pView[2]* pView[3] * 3; infoHeader.biXPelsPerMeter = 0; infoHeader.biYPelsPerMeter = 0; infoHeader.biClrUsed = 0; infoHeader.biClrImportant = 0; fileHeader.bfType = 0x4D42; fileHeader.bfReserved1 = 0; fileHeader.bfReserved2 = 0; fileHeader.bfOffBits = 54; fileHeader.bfSize = (DWORD)(sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+pView[2]* pView[3] * 3); FILE *fd; if( !(fd = fopen(filepath,"wb+")) )//filepath为你所保存文件的名字 { AfxMessageBox("bmp图片申请出错"); exit(0); } else { fwrite(&fileHeader,1,sizeof(BITMAPFILEHEADER),fd); fwrite(&infoHeader,1,sizeof(BITMAPINFOHEADER),fd); fwrite(data,1,pView[2]* pView[3] * 3,fd); fclose(fd); } delete[] data; delete[] _data; }场景截图示例: