gpt4 book ai didi

c++ - 如何将帧缓冲区数据写入 JPEG 或 BMP 图像

转载 作者:行者123 更新时间:2023-11-30 05:36:31 25 4
gpt4 key购买 nike

我是openGl的新手,我有一个任务是将帧缓冲区(opengl离屏渲染数据)写入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 文件。

最佳答案

你是或正确的道路。

首先,不要声明未初始化的变量(尤其是指针),否则会导致程序故障(更多信息请阅读: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 需要是 byte*。如果您想写入 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)

关于c++ - 如何将帧缓冲区数据写入 JPEG 或 BMP 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33538791/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com