2

任何可用于将从 glReadPixels 获得的原始像素数据转换为 JPEG 格式并返回的 C++ 示例?

4

3 回答 3

2

您可以使用 ImageMagick 库将原始数据转换为 jpeg 图像数据,反之亦然。使用相同的库,您可以将 jpeg 图像数据转换为原始 (RGB) 数据。

于 2010-11-18T12:31:56.260 回答
1

为此使用外部库。

我会推荐DevIL,这是您处理图像文件的第一把瑞士军刀。你只需要

  • 通过 DevIL 在内存中创建 RGB 图像,
  • 调用glReadPixels以使用从 GL 帧缓冲区读取的像素填充您的 DevIL 图像,
  • 调用ilSaveImage("foo.jpg")保存文件。您也可以使用bmp,png和其他一些 - 格式将从文件名中自动检测到。

简单的。

于 2010-11-18T13:49:41.687 回答
0

我不确定 OpenGL 是否支持处理 JPEG 图像。这不是图书馆的真正用途。

不过,一旦您访问了像素数据,您应该能够轻松地使用OpenCV将图像写入 JPEG(或任何其他格式)。这里有一些伪代码可以帮助你。

/*
 * On Linux, compile with:
 *
 * g++ -Wall -ggdb -I. -I/usr/include/opencv -L /usr/lib -lm -lcv -lhighgui -lcvaux filename.cpp -o filename.out
 */

#include <cv.h>    
#include <highgui.h>

/*
 * Your image dimensions.
 */
int width;
int height;

CvSize size = cvSize(width, height);

/*
 * Create 3-channel image, unsigned 8-bit per channel.
 */
IplImage *image = cvCreateImage(size, IPL_DEPTH_8U, 3);

for (int i = 0; i < width; ++i)
for (int j = 0; j < height; ++j)
{
    unsigned int r;
    unsigned int g;
    unsigned int b;

    /*
     * Call glReadPixels, grab your RGB data.
     * Keep in mind that OpenCV stores things in BGR order.
     */
    CvScalar bgr = cvScalar(b, g, r);
    cvSet2D(image, i, j, bgr);
}

cvSaveImage("filename.jpg", image);
cvReleaseImage(&image);

如果您环顾四周,也存在其他处理 JPEG 的库。

于 2010-11-18T04:33:45.530 回答