从 glReadPixels 的结果中保存 png

Posted

技术标签:

【中文标题】从 glReadPixels 的结果中保存 png【英文标题】:save png from the results of glReadPixels 【发布时间】:2016-12-23 20:09:12 【问题描述】:

根据之前的问题1 和2,我有以下代码:

如何截屏:

int width = glutGet(GLUT_WINDOW_WIDTH);
int height = glutGet(GLUT_WINDOW_HEIGHT);

std::vector< unsigned char > rgbdata(4*width*height);
glReadPixels(0, 0, width, height,GL_RGBA,GL_UNSIGNED_BYTE, &rgbdata[0]);

int save_result = SOIL_save_image
    (
        filename,
        SOIL_SAVE_TYPE_PNG,
        width, height, 4,
        rgbdata.data()
    );

以及如何在PNG中存储:

#define png_infopp_NULL (png_infopp)NULL
#define int_p_NULL (int*)NULL
#include <boost/gil/gil_all.hpp>
#include <boost/gil/extension/io/png_dynamic_io.hpp>
using namespace boost::gil;
int main()

    rgb8_image_t img(512, 512);
    rgb8_pixel_t red(255, 0, 0);
    fill_pixels(view(img), red);
    png_write_view("redsquare.png", const_view(img));

我想将捕获的屏幕保存到png 文件中。 现在,问题是如何将这些代码级联起来?这些数组可以相互转换吗?

【问题讨论】:

投反对票的人似乎很难理解一个简单的概念。这个问题不清楚。 【参考方案1】:

谁知道? 最好将图像作为使用 C malloc 分配的原始指针传递,主要是因为人们为本质上相同的数据类型创建别名,这会使模板变得一团糟。

选择 rgb 或 rgba 作为您的内部格式。然后编写胶水代码转换成第三方库方想要的格式。在这种情况下,Boost 采用了 rgb8_image_t,它由 Boost 自己创建。您不希望该符号在其他任何地方污染您的命名空间,除非在您依赖 bool gil 保存图像的确切位置。所以写一个包装器,然后在 Boost 中摆弄,直到格式正确。

如果您使用 Baby X 文件保存程序,这些问题就会消失。 这些例程采用 unsigned char 缓冲区,并且不尝试导出图像的数据类型。

https://github.com/MalcolmMcLean/babyxrc

(lodePNG 不是我的,它是由 Lode Vandevenne 编写的,所以请遵守许可要求。您可以使用我编写的其他格式做任何您想做的事情)。

【讨论】:

以上是关于从 glReadPixels 的结果中保存 png的主要内容,如果未能解决你的问题,请参考以下文章

保存使用 glReadPixels 读取的图像,其中 alpha 值不是一

glReadPixels 保存到 BMP - 颜色失真

整个窗口的 glReadPixels (OpenGL)

如何使用 OpenGL 保存 OpenGL 绘制?

osg::readPixels,glreadPixels截图,保存图片的alpha不对,总是255

screenshot() 给出:ImportError: cannot import name glReadPixels error in kivy