我是openGl的新手,我的任务是将帧缓冲区(opengl offscreen渲染数据)写入JPG或Bmp图像。
我谷歌但无法找到合适的解决方案...
我尝试了以下代码,但结果是一个不受支持的文件。我无法打开该文件。
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文件。
答案 0 :(得分:1)
你是或正确的道路。
首先,不要声明变量(特别是指针)未初始化它可能导致程序故障(更多请阅读:https://softwareengineering.stackexchange.com/questions/223862/how-important-is-to-initialize-a-variable)
所以不要这样做:
unsigned char *Buff;
Buff = new unsigned char[512*512*3];
做:
unsigned char *Buff=new unsigned char[512*512*3];
你的buff需要是字节*。如果要写入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)
答案 1 :(得分:0)
要转换为BMP,您需要以24bpp格式创建正确大小的空位图,然后将GL_RGB
数据的每一行复制到其像素阵列。 (请记住,BMP从下向上存储行,并将每行填充到4个字节的倍数。)转换为JPEG的最简单方法可能是在内存中创建BMP并压缩它。有几个图形库可以提供帮助。