首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将屏幕部分保存到文件中(SOIL和glReadPixels)

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

Stack Overflow用户
提问于 2013-06-20 10:47:29
回答 2查看 1.5K关注 0票数 4

我试图保存一个大小为5x5像素的图像,用glReadPixels读取到一个使用SOIL的文件中。

我读取像素:

代码语言:javascript
复制
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]); 

然后尝试用土壤的保存图像函数保存读取的数据。

代码语言:javascript
复制
int save_result = SOIL_save_image
    (
    "image_patch.bmp",
    SOIL_SAVE_TYPE_BMP,
    5, 5, 4,
    rgbdata[0]
    );

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

解决方案(克里斯蒂安·劳)

代码语言:javascript
复制
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()
    );
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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] )。

票数 5
EN

Stack Overflow用户

发布于 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),则可能会导致意想不到的结果。因此,您还必须避免这些问题,以下是解决方案:

代码语言:javascript
复制
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glPixelStorei(GL_PACK_ALIGNMENT,1);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17211676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档