2

OpenGL コマンドで画面を描画します。そして、この画面を .bmp または .png 形式で保存する必要があります。しかし、私はそれを行うことはできません。glReadpixels を使用していますが、続行できません。この図面を OpenGL を使用して c++ で保存するにはどうすればよいですか?

4

4 に答える 4

5

来ました!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-12T21:07:59.657 に答える
1

次の点で修正する必要があります。

bmih.biXPelsPerMeter = bmih.biYPelsPerMeter = 0;

そうしないと、一部の画像編集が正しく開くことができません。

于 2013-03-15T09:35:05.793 に答える
1

ラスター形式を求めていることは承知していますが、間接的な方法は、最初に gl2ps (http://www.geuz.org/gl2ps/) を介してベクター グラフィックスを出力することです。使用例は、パッケージとサイト (http://www.geuz.org/gl2ps/#tth_sEc3) で提供されています。

次に、別のツール (Inkscape、Image/GraphicsMagick など) またはライブラリを使用して、ベクター出力を選択した形式に変換できます。追加の利点は、将来、任意の解像度のビットマップに変換できることです。

于 2012-03-21T00:06:48.957 に答える
1

特に野心的 (またはマゾヒスティック) でない限り、既にこれをサポートしているDevILのようなライブラリを使用することをお勧めします。現在のバージョンは、PNG と BMP の両方の形式で読み込んだり、保存したりできます。

IJG などと比較すると、これは OpenGL や DirectX での作業に重点を置いています (たとえば、ファイルをテクスチャにかなり直接ロードしたり、その逆を行ったりできます)。

于 2012-03-11T18:01:00.823 に答える