当宽度不是4个倍数时,GlRead像素会导致堆叠粉碎
glReadPixels leads to stack smashing when the width is not a multiple of 4
我正在尝试使用glReadPixels
通过以下代码提取图像数据:
std::array<unsigned char, 3 * height * width> data;
glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, data.data());
当宽度为4的倍数时,图像是完美的(高度似乎是任意的)。但是,如果没有,我会收到运行时错误:
*** stack smashing detected ***: <unknown> terminated
所以,例如,以下(宽度,高度)对工作正常:
(20,20),(20,21),(20,22),(20,23),(20,24)
(24,20),(24,21),(24,22),(24,23),(24,24)
以下产量"堆叠粉碎"错误:
(21,20),(22,20),(23,20)
我猜想正在进行一些填充,但我在OpenGL网站上没有提及它:
https://www.khronos.org/registry/opengl-refpages/gl2.1/xhtml/glreadpixels.xml
有人可以向我指出一些文档,以解释我应该分配多少空间,以及填充的样子?
默认情况下,读取操作的对齐 GL_PACK_ALIGNMENT
设置为4个字节。这意味着,每行都必须从该路线开始的地址开始。由于您正在读取每个像素的3个字节,因此您需要的内存比(3 * width) % 4 != 0
。
您可以分配所需的内存量,也可以通过调用
来强制某个对齐方式glPixelStore(GL_PACK_ALIGNMENT, desired_alignment);
正如@Dave指出的那样,只允许1、2、4或8作为对齐。
相关文章:
- 如何在不产生任何垃圾的情况下获得C中的像素
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- 如何在24位SDL_Surface上设置像素的颜色
- 如何从SDL_Surface获取特定像素的颜色
- 如何将CMSampleBufferRef/CIImage/UIImage转换为像素,例如uint8_t[]
- 在C++中查找像素 RGB 数据的最快方法是什么?
- 是否可以从 OpenGL 缓冲区获取原始大小的像素?
- 选择基于另一个垫子的非零像素的cv::Mat的一部分?
- 如何使用 sdl2 快速绘制像素网格?
- 如何在C++中进行像素操作? - Linux
- 他们如何将红外锁定像素转换为镜头前方 1m 的正常平面上的位置
- 访问随机图像像素的快速方法,最多一次
- OpenCV 像素访问点与 at() - 不同的值
- 如何使用 freetype2 访问单色位图中的像素状态
- 尝试渲染像素坐标时,简单线条渲染失败
- 计算另一个图像像素满足条件的像素值的平均值
- 如何返回定义良好的内存部分?例如来自图像数据的像素的颜色值
- 在Qt-cpp中通过像素获取QString的子字符串
- 当宽度不是4个倍数时,GlRead像素会导致堆叠粉碎
- glread像素模板缓冲区总是抛出GL_INVALID_OPERATION