我试图保存一个大小为5x5像素的图像,用glReadPixels读取到一个使用SOIL的文件中。
我读取像素:
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]); 然后尝试用土壤的保存图像函数保存读取的数据。
int save_result = SOIL_save_image
(
"image_patch.bmp",
SOIL_SAVE_TYPE_BMP,
5, 5, 4,
rgbdata[0]
);但是当试图保存图像时,我会得到一个未处理的异常。
解决方案(克里斯蒂安·劳)
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()
);发布于 2013-06-20 11:51:20
您正在创建指向无符号字符(std::vector<unsigned char*> )的指针向量,但您需要的只是一个指向无符号字符的向量(std::vector<unsigned char>)。
在对SOIL_save_image的调用中,您不必给它rgbdata[0],这将是一个没有符号的字符(不正确的向量类型是一个未初始化的指针,可能会导致一些内存访问错误),而是指向完整数据的指针,因此是rgbdata.data() (如果没有C++11,则为&rgbdata[0] )。
发布于 2017-01-03 09:51:04
还注意到:
GL的默认包/解压缩图像宽度应该是4的倍数,也就是说,glReadPixels(x, y, width, height, format, type, data)中的width应该满足width % 4 == 0的条件。
如果width % 4 != 0(in your 5 % 4 != 0),则可能会导致意想不到的结果。因此,您还必须避免这些问题,以下是解决方案:
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glPixelStorei(GL_PACK_ALIGNMENT,1);https://stackoverflow.com/questions/17211676
复制相似问题