如何使用 OpenGL 保存 OpenGL 绘制?

Posted

技术标签:

【中文标题】如何使用 OpenGL 保存 OpenGL 绘制?【英文标题】:How can I save OpenGL draw with OpenGL? 【发布时间】:2012-03-11 17:33:29 【问题描述】:

我用 OpenGL 命令绘制了一个屏幕。而且我必须将此屏幕保存为 .bmp 或 .png 格式。但我做不到。我正在使用 glReadpixels 但我无法继续。如何使用 OpenGL 在 c++ 中保存此绘图?

【问题讨论】:

保存文件并不是真正的 opengl 的工作。为此,您需要一些其他库,例如 libjpeg。 【参考方案1】:

它来了!您必须包含 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);

【讨论】:

已编辑:它是 GL_BGR,而不是 GL_RGB。【参考方案2】:

除非你感觉特别有野心(或者可能是受虐狂),否则你可能想要使用像 DevIL 这样已经支持此功能的库。当前版本可以加载和/或保存为 PNG 和 BMP 格式,以及其他几十种格式。

与 IJG 之类的东西相比,它更倾向于使用 OpenGL 或 DirectX(例如,它可以将文件直接加载到纹理中,反之亦然)。

【讨论】:

我必须使用 opengl 库。不可以吗? 你会使用 DevIL 和 OpenGL。可以用glReadPixels读回像素,然后在前面放一个header,根据需要插入padding,保存为BMP文件,但是OpenGL没有提供任何直接支持的东西。 我如何使用 DevIL?你可以帮助我 我已链接到您可以下载它的站点。它包括非常好的文档。如果您遇到具体问题,最好在单独的问题中询问。 你能给我使用这个库吗?使用 glReadpixels()【参考方案3】:

我知道您要的是光栅格式,但间接的方法是首先通过 gl2ps (http://www.geuz.org/gl2ps/) 输出矢量图形。使用示例随包和网站 (http://www.geuz.org/gl2ps/#tth_sEc3) 一起提供。

然后,可以使用其他工具(Inkscape、Image/GraphicsMagick 等)或库将矢量输出转换为您选择的格式。另一个好处是您可以在将来转换为任何分辨率的位图。

【讨论】:

【参考方案4】:

有一点需要解决:

bmih.biXPelsPerMeter = bmih.biYPelsPerMeter = 0;

否则,某些图片编辑将无法正确打开。

【讨论】:

以上是关于如何使用 OpenGL 保存 OpenGL 绘制?的主要内容,如果未能解决你的问题,请参考以下文章

使用 glut、opengl 绘制散点图矩阵

绘制球体OpenGL C++

opengl如何绘制一个三维平面

如何在OpenGL中绘制单个像素?

如何使用 OpenGL 在圆内绘制随机点?

在按下和释放鼠标时绘制一个矩形,opengl