从GlreadPixels的结果中保存PNG

save png from the results of glReadPixels

本文关键字:保存 PNG 结果 GlreadPixels      更新时间:2023-10-16

在以前的问题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文件中。现在,问题是如何相互级联这些代码?这些阵列可转换吗?

谁知道?最好将图像传递给用C malloc分配的原始指针,这主要是因为人们为基本相同的数据类型创建别名,并且将模板陷入混乱。

选择RGB或RGBA作为内部格式。然后编写胶水代码以转换为第三库聚会所需的格式。在这种情况下,BOOST正在采用RGB8_IMAGE_T,该RGB8_IMAGE_T本身会创建。您不希望该符号在其他任何地方污染您的名称空间,除非您依赖Bool Gil来保存图像。因此,写一个包装器,然后用升压提出,直到格式正确为止。

如果您使用baby x文件保存例程,这些问题就会消失。这些例程采用未签名的char缓冲区,不要试图导出图像的数据类型。

https://github.com/malcolmmclean/babyxrc

(Lodepng不是我的,它是由Lode Vandevenne撰写的,所以请遵守许可要求。您可以用其他格式来完成您想要的,因为它们是由我撰写的)。