簡體   English   中英

如何將幀緩沖區數據寫入JPEG或BMP圖像

[英]How to write frame buffer data in to a JPEG or BMP image

我是openGl的新手,我的任務是將幀緩沖區(opengl屏幕外渲染數據)寫入JPG或Bmp圖像。

我用Google搜索,但找不到正確的解決方案...

我嘗試了以下代碼,但結果是不支持的文件。我無法打開該文件。

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-變量

所以不要這樣做:

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

做:

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

要轉換為BMP,您需要以24bpp格式創建一個合適大小的空位圖,然后將GL_RGB數據的每一行復制到其像素數組。 (請記住,BMP從下至上存儲行,並將每行填充到4字節的倍數。)轉換為JPEG的最簡單方法可能是在內存中創建BMP並對其進行壓縮。 有幾個圖形庫會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM