将部分屏幕保存到文件(SOIL和glReadPixels)

时间:2013-06-20 10:47:29

标签: c++ opengl soil

我正在尝试保存大小为5x5像素的图像,使用SOIL将glReadPixels读入文件。

我读了像素:

int x = 400;
int y = 300;
std::vector< unsigned char* > rgbdata(4*5*5);
glReadPixels(x, y, 5, 5,GL_RGBA,GL_UNSIGNED_BYTE, &rgbdata[0]); 

然后我尝试使用SOIL的保存图像功能保存读取数据

int save_result = SOIL_save_image
    (
    "image_patch.bmp",
    SOIL_SAVE_TYPE_BMP,
    5, 5, 4,
    rgbdata[0]
    );

但是在尝试保存图像时,我得到了一个未处理的异常。

解决方案(由Christian Rau提供)

int x = 400;
int y = 300;
std::vector< unsigned char > rgbdata(4*5*5);
glReadPixels(x-(5/2), y-(5/2), 5, 5,GL_RGBA,GL_UNSIGNED_BYTE, &rgbdata[0]);

int save_result = SOIL_save_image
    (
    "image_patch.bmp",
    SOIL_SAVE_TYPE_BMP,
    5, 5, 4,
    rgbdata.data()
    );

2 个答案:

答案 0 :(得分:5)

您正在创建一个指向unsigned char(std::vector<unsigned char*>的指针的向量,但您想要的只是无符号字符(std::vector<unsigned char>)的向量。

在对SOIL_save_image的调用中,你不必给它rgbdata[0],这将是一个单一的无符号字符(并且你的错误向量类型是一个未初始化的指针,可能会导致一些内存访问错误),但是指向完整数据的指针,因此rgbdata.data()(如果你没有C ++ 11,则为&rgbdata[0]。)

答案 1 :(得分:0)

另请注意:

GL 默认打包/解压缩图片宽度应该是 4 的倍数,也就是width glReadPixels(x, y, width, height, format, type, data)的倍数1}}应符合条件width % 4 == 0

如果 width % 4 != 0 (在您的情况下为5 % 4 != 0),可能会导致意外结果。所以你也必须避免这些问题,这是解决方案:

glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glPixelStorei(GL_PACK_ALIGNMENT,1);