我正在尝试保存大小为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()
);
答案 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);