如何捕获屏幕:
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
文件中。
现在,问题是如何将这些代码相互级联?这些阵列是否可以相互转换?
答案 0 :(得分:-2)
选择rgb或rgba作为内部格式。然后编写胶水代码以转换为第三个图书馆方想要的格式。在这种情况下,Boost正在使用一个rgb8_image_t,这是Boost自己创建的。您不希望该符号在其他任何地方污染您的命名空间,除非您依靠bool gil保存图像。所以写一个包装器然后摆弄Boost直到格式正确。
如果您使用Baby X文件保存例程,这些问题就会消失。 例程采用unsigned char缓冲区,不要尝试导出图像的数据类型。
https://github.com/MalcolmMcLean/babyxrc
(lodePNG不是我的,它是由Lode Vandevenne编写的,所以请遵守许可证要求。你可以用他们创作的其他格式做你想要的事情。)