我使用OpenGL命令绘制了一个屏幕。并且我必须将此屏幕保存为.bmp或.png格式。但我不能这么做。我正在使用glReadpixels,但我无法继续。如何使用OpenGL在c++中保存此图形?
发布于 2012-03-13 05:08:00
它来了!您必须包含WinGDI.h (我认为GL会这样做!)
void SaveAsBMP(const char *fileName)
{
FILE *file;
unsigned long imageSize;
GLbyte *data=NULL;
GLint viewPort[4];
GLenum lastBuffer;
BITMAPFILEHEADER bmfh;
BITMAPINFOHEADER bmih;
bmfh.bfType='MB';
bmfh.bfReserved1=0;
bmfh.bfReserved2=0;
bmfh.bfOffBits=54;
glGetIntegerv(GL_VIEWPORT,viewPort);
imageSize=((viewPort[2]+((4-(viewPort[2]%4))%4))*viewPort[3]*3)+2;
bmfh.bfSize=imageSize+sizeof(bmfh)+sizeof(bmih);
data=(GLbyte*)malloc(imageSize);
glPixelStorei(GL_PACK_ALIGNMENT,4);
glPixelStorei(GL_PACK_ROW_LENGTH,0);
glPixelStorei(GL_PACK_SKIP_ROWS,0);
glPixelStorei(GL_PACK_SKIP_PIXELS,0);
glPixelStorei(GL_PACK_SWAP_BYTES,1);
glGetIntegerv(GL_READ_BUFFER,(GLint*)&lastBuffer);
glReadBuffer(GL_FRONT);
glReadPixels(0,0,viewPort[2],viewPort[3],GL_BGR,GL_UNSIGNED_BYTE,data);
data[imageSize-1]=0;
data[imageSize-2]=0;
glReadBuffer(lastBuffer);
file=fopen(fileName,"wb");
bmih.biSize=40;
bmih.biWidth=viewPort[2];
bmih.biHeight=viewPort[3];
bmih.biPlanes=1;
bmih.biBitCount=24;
bmih.biCompression=0;
bmih.biSizeImage=imageSize;
bmih.biXPelsPerMeter=45089;
bmih.biYPelsPerMeter=45089;
bmih.biClrUsed=0;
bmih.biClrImportant=0;
fwrite(&bmfh,sizeof(bmfh),1,file);
fwrite(&bmih,sizeof(bmih),1,file);
fwrite(data,imageSize,1,file);
free(data);
fclose(file);
}发布于 2012-03-12 02:01:01
除非您觉得特别有野心(或者可能是受虐狂),否则您可能想要使用像DevIL这样已经支持这一点的库。当前版本可以加载和/或保存为PNG和BMP格式,以及其他几十种格式。
与IJG之类的东西相比,它更倾向于使用OpenGL或DirectX (例如,它可以相当直接地将文件加载到纹理中,反之亦然)。
发布于 2012-03-21 08:06:49
我知道您要求的是光栅格式,但一种间接的方法是首先通过gl2ps (http://www.geuz.org/gl2ps/)输出矢量图形。软件包和网站(http://www.geuz.org/gl2ps/#tth_sEc3)上提供了用法示例。
然后,可以使用另一个工具(Inkscape、Image/GraphicsMagick等)将矢量输出转换为您选择的格式。或者是库。一个额外的好处是您可以在将来转换为任何分辨率的位图。
https://stackoverflow.com/questions/9657196
复制相似问题