使用glgetTeximage()访问像素
Pixel access with glGetTexImage()?
我对openGl和 glGetTexImage()
。
我想获得我以前创建的纹理的像素这样的代码:
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D,
0,
GL_RGBA,
width,
height,
0,
GL_RGB,
GL_UNSIGNED_BYTE,
someRandomPixels);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
我正在使用sdl2。
加载纹理后,我试图获得此纹理的像素在Gluint* Pixels指针中,我声明如下:
GLuint* pixels = new GLuint[256*256*4];
此图像的大小为256x256像素。
我使用
获得了像素数据GLuint* Textur::getPixelsOfTextur(GLuint textur, int width, int height, int numChannels)
{
GLuint* pixels=new GLuint[width*height*numChannels];
glBindTexture(GL_TEXTURE_2D, textur);
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_INT, pixels);
return pixels;
}
其中" numchannels"为4,RGB
为3现在我的问题是,我真的不知道如何正确地解决Pixel P(x,y(,因为我的数组的大小比像素计数大4倍,并且每次使用较小尺寸的Visual Studios都会抛出一个错误:
Exception thrown at 0x5ED71FCE (opengl32.dll) in sdl_opengl_Frameworktest.exe: 0xC0000005: Access violation writing location 0x09C33000.
另外,是否可以在2D数组中获取这些数据?
字节中数组的大小为1048576字节(256 * 256 * 4 * sizeof(GLuint)
(。这是因为,单像素的每个颜色通道都存储在单独的GLuint
中,大小为4个字节(sizeof(GLuint) == 4
(。因此,每个像素的大小为16字节,因为每个像素有4个颜色通道和每个颜色通道的sizeof(GLuint)
。
可能足以将每种颜色存储在GLubyte
中。然后数组的大小为262144字节(256 * 256 * 4 * sizeof(GLubyte)
(
GLubyte* pixels = new GLubyte[256*256*4];
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
无论您使用GLuint
还是GLubyte
,都可以像这样访问单个像素的颜色:
GLuint r, g, b, a; // or GLubyte r, g, b, a;
size_t x, y; // line and column of the pixel
size_t elmes_per_line = 256 * 4; // elements per line = 256 * "RGBA"
size_t row = y * elmes_per_line;
size_t col = x * 4;
r = pixels[row + col];
g = pixels[row + col + 1];
b = pixels[row + col + 2];
a = pixels[row + col + 3];
如果要从r
,g
,b
值计算一个灰度值,则可以这样做:
GLubyte gray = (GLubyte)((r + g + b) / 3.0);
可以在 Luma 上找到另一个流行的公式:
GLubyte gray = (GLubyte)(r*0.2126 + g*0.7152 + b*0.0722);
用灰度替换颜色RGB通道:
pixels[row + col] = gray;
pixels[row + col + 1] = gray;
pixels[row + col + 2] = gray;
相关文章:
- 访问随机图像像素的快速方法,最多一次
- OpenCV 像素访问点与 at() - 不同的值
- 如何使用 freetype2 访问单色位图中的像素状态
- 访问和更改基于另一个图像的像素颜色-opencv c++
- OpenCV 访问像素的颜色值
- 如何在OpenCV Cuda(GpuMat)中访问像素
- 使用glgetTeximage()访问像素
- 如何在opencv C++中访问特定的超像素
- OpenCV VisualStudio,C 代码错误尝试访问像素
- 从SDL_Texture访问像素颜色
- 不能通过基于指针的访问像素强度来分割 RGB 图像
- 访问 openCV 中某个图像中所有像素的 RGB 值
- 如何使用OpenCV快速访问像素值C++
- 访问图像像素;MatIterator_<> 和 Mat::at 运算符的比较
- 访问像素值,而不在内存中加载大图像的图像
- 使用 BMP 作为高度图.如何访问像素颜色以设置高度
- 使用Mat OpenCV访问像素
- 使用OpenCV多通道Mat沿着通道方向访问像素
- 使用OpenCV点击图像中的一个点来访问像素值
- 无法从灰度图像访问像素值