OpenGL:将绘制场景保存为bmp图片

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;
}
场景截图示例:





猜你喜欢

转载自blog.csdn.net/hw140701/article/details/78656084