4

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

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

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()
    );
4

2 回答 2

5

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

并且在对您的调用中SOIL_save_image不必给出它rgbdata[0],这将是一个 unsigned char (并且您的向量类型不正确,一个未初始化的指针,可能导致一些内存访问错误),而是一个指向完整数据的指针,因此rgbdata.data()(或者&rgbdata[0]如果你没有 C++11)。

于 2013-06-20T11:51:20.353 回答
0

另请注意:

GL默认打包/解包图片宽度应该是4的倍数,也就是说widthinglReadPixels(x, y, width, height, format, type, data)应该满足条件width % 4 == 0

如果width % 4 != 0(在你的情况下5 % 4 != 0),它可能会导致意想不到的结果。因此,您还必须避免这些问题,这是解决方案:

glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glPixelStorei(GL_PACK_ALIGNMENT,1);
于 2017-01-03T09:51:04.037 回答