2012-03-11 3 views
1

Я рисую экран с помощью команд OpenGL. И я должен сохранить этот экран в формате .bmp или .png. Но я не могу этого сделать. Я использую glReadpixels, но я не могу продолжать. Как сохранить этот чертеж в C++ с помощью OpenGL?Как сохранить OpenGL-ничью с помощью OpenGL?

+1

Это не проблема opengl для сохранения файлов. Для этого вам нужна другая библиотека, например libjpeg. –

ответ

3

Вот оно! Вы должны включить WinGDI.h

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); 
} 
+0

Отредактировано: Это GL_BGR, а не GL_RGB. – chakmeshma

1

Если вы не чувствуете себя особенно амбициозным (или, возможно, мазохистом), вы, вероятно, захотите использовать библиотеку, такую ​​как DevIL, которая уже поддерживает это. Текущая версия может загружать и/или сохранять в форматах PNG и BMP вместе с несколькими десятками других.

По сравнению с чем-то вроде IJG это ориентировано гораздо больше на работу с OpenGL или DirectX (например, он может загружать файл довольно прямо в текстуру или наоборот).

+0

Я должен использовать библиотеку opengl. Разве это невозможно? –

+0

Вы используете DevIL вместе с OpenGL. Можно читать пиксели назад с помощью glReadPixels, затем поместить заголовок на передний план, вставить прокладку по мере необходимости и сохранить как файл BMP, но OpenGL не предоставляет ничего, чтобы поддерживать его напрямую. –

+0

Как я могу использовать DevIL? u может помочь мне –

0

Я знаю, что вы просите растровые форматы, но косвенным образом будет первый выход векторной графики через gl2ps (HTTP (который я думаю, что GL будет делать это!): //www.geuz.org/gl2ps/). Примеры использования предоставляются с пакетом и на сайте (http://www.geuz.org/gl2ps/#tth_sEc3).

Затем векторный вывод можно преобразовать в формат по вашему выбору с помощью другого инструмента (Inkscape, Image/GraphicsMagick и т. Д.) Или библиотеки. Дополнительным преимуществом является то, что вы можете конвертировать в растровые изображения любого разрешения в будущем.

0

Одно нужно быть зафиксирована на уровне:

bmih.biXPelsPerMeter = bmih.biYPelsPerMeter = 0; 

В противном случае, некоторые фото редактирования не может открыть правильно.

Смежные вопросы