2015-11-05 122 views
0

我是openGl的新手,我有一个任务将帧缓冲区(opengl离屏渲染数据)写入JPG或Bmp图像。如何将帧缓冲区数据写入JPEG或BMP图像

我谷歌,但无法找到合适的解决方案...

我曾尝试下面的代码,但结果是不支持的file.I可能无法打开该文件。

FILE *Out; 
    unsigned char *Buff; 

    // Capture a screen shot. Save as a RAW-format file. 
    // First, allocate memory. 
    Buff = new unsigned char[512*512*3]; 

    // Now, get pixels. 
    glReadBuffer(GL_BACK); 
    glReadPixels(0,0, 512, 512, GL_RGB, GL_UNSIGNED_BYTE, Buff); 

    // Now, open to file and write pixels. 
    Out = fopen(Filename, "wb"); 
    if(!Out) return; 
    fwrite(Buff, 3, 512*512, Out); 


    fclose(Out); 
    delete[] Buff; 

这里我用的原始文件,但我想要的是JPEG或BMP文件。

+1

使用图像加载/书写库,jpeg是一个复杂的格式来创建一个文件作者。 –

回答

1

你是或正确的道路。第一

第一件事,不声明变量(尤其是三分球),未初始化它会导致程序出现故障(更多请阅读:https://softwareengineering.stackexchange.com/questions/223862/how-important-is-to-initialize-a-variable

所以不是这样做的:

务必:

unsigned char *Buff=new unsigned char[512*512*3]; 

你的爱好者需要是字节*。如果你想写入BMP文件,你需要在你的头以下:

#include <Windows.h> 

现在你可以保存到使用BITMAPFILEHEADER和BITMAPINFOHEADER位图文件。 你的新代码应该看起来像这样。

byte* Buff = new byte[512*512*3]; 
if (!Buff) 
    return; 

glReadBuffer(GL_BACK); 
glReadPixels(0, 0, 512, 512, GL_RGB, GL_UNSIGNED_BYTE, Buff); 


FILE *Out = fopen(filename, "wb"); 
if (!Out) 
    return; 
BITMAPFILEHEADER bitmapFileHeader; 
BITMAPINFOHEADER bitmapInfoHeader; 

bitmapFileHeader.bfType = 0x4D42; 
bitmapFileHeader.bfSize = windowWidth*windowHeight * 3; 
bitmapFileHeader.bfReserved1 = 0; 
bitmapFileHeader.bfReserved2 = 0; 
bitmapFileHeader.bfOffBits = 
    sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); 

bitmapInfoHeader.biSize = sizeof(BITMAPINFOHEADER); 
bitmapInfoHeader.biWidth = windowWidth - 1; 
bitmapInfoHeader.biHeight = windowHeight - 1; 
bitmapInfoHeader.biPlanes = 1; 
bitmapInfoHeader.biBitCount = 24; 
bitmapInfoHeader.biCompression = BI_RGB; 
bitmapInfoHeader.biSizeImage = 0; 
bitmapInfoHeader.biXPelsPerMeter = 0; // ? 
bitmapInfoHeader.biYPelsPerMeter = 0; // ? 
bitmapInfoHeader.biClrUsed = 0; 
bitmapInfoHeader.biClrImportant = 0; 

fwrite(&bitmapFileHeader, sizeof(BITMAPFILEHEADER), 1, Out); 
fwrite(&bitmapInfoHeader, sizeof(BITMAPINFOHEADER), 1, Out); 
fwrite(Buff, windowWidth*windowHeight * 3, 1, Out); 
fclose(Out); 

delete[] Buff; 

(代码来自:http://dave.thehorners.com/tech-talk/programming/124-opengl-writing-the-framebuffer-to-disk

+0

我很确定,只有当行大小恰好是4的倍数时才有效。 – Davislor

+0

@ Mihai-daniel virna..i当我尝试这段代码时,输​​出空白图像作为输出。你知道原因。我应该将其转换为其他内容以便看到图像? –

+0

@GreeshmaPanicker ..目前我不能测试代码,因为我不在家。在我自己测试之后,我可以在晚上回复。 –

0

要转换为BMP,你要创建一个空的位图格式的24 bpp的大小合适,那么GL_RGB的每一行数据复制到它的像素阵列。 (请记住,BMPs从下往上存储行并将每行填充到4个字节的倍数)。转换为JPEG的最简单方法可能是在内存中创建一个BMP并对其进行压缩。有几个图形库可以提供帮助。

+0

你可以请分享代码 –

+0

@GreeshmaPanicker我今天不能。你知道,StackExchange不是一种编码服务。 :) – Davislor

+0

好吧...好:) –