C++ 将Uint8转换为无符号字符RGB值
我已经回答了下面的问题。感谢加文布的帮助 问题: 我试图复制一种纹理,只是为了一种学习体验。我使用24位TGA图像,并用SDL加载它。我已经创建了自己的结构C++ 将Uint8转换为无符号字符RGB值,c++,sdl,rgb,uint32,C++,Sdl,Rgb,Uint32,我已经回答了下面的问题。感谢加文布的帮助 问题: 我试图复制一种纹理,只是为了一种学习体验。我使用24位TGA图像,并用SDL加载它。我已经创建了自己的结构 struct Colour24 { unsigned char r; unsigned char g; unsigned char b; } unsigned char* texture = new unsigned char[width * height * 3]; for (int y = 0; y
struct Colour24
{
unsigned char r;
unsigned char g;
unsigned char b;
}
unsigned char* texture = new unsigned char[width * height * 3];
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
int index = (y * width) + x;
Colour24 colour = getColourAt(x, y);
newTexture[index] = colour.r;
newTexture[index + 1] = colour.g;
newTexture[index + 2] = colour.b;
}
}
Colour24 getColour(int x, int y)
{
Uint32 pixel;
Uint8 red, green, blue;
Colour24 rgb;
pixel = getPixel(m_surface, x, y); // using the SDL get pixel function
SDL_GetRGB(pixel, m_surface->format, &red, &green, &blue);
rgb.r = red;
rgb.b = blue;
rgb.g = green;
return rgb;
}
struct color24
{
无符号字符r;
无符号字符g;
无符号字符b;
}
无符号字符*纹理=新的无符号字符[宽度*高度*3];
对于(int y=0;y格式、红色、绿色和蓝色);
rgb.r=红色;
rgb.b=蓝色;
rgb.g=绿色;
返回rgb;
}
旧的:
我正计划将其发送到OpenGL纹理中,当我直接发送曲面->像素时,它确实起作用。但是我想自己创建数据数组。非常感谢您的帮助
编辑:对不起,我解释得不够清楚。我正在尝试从包含24位TGA图像的SDL_曲面手动重新创建纹理,然后将其交给opengl创建纹理。我已经用surface->pixels测试了我的opengl代码,效果很好。我只是想知道我在加载时哪里出错。Uint8的大小取决于它的声明。另一方面,在C++标准下,“代码>未签名CHAR/<代码>的大小也没有被精确地指定为8位,尽管它在许多平台上是8位。
最好在
color24
中直接使用Uint8
,以避免转换错误。Uint8的大小取决于其声明。另一方面,在C++标准下,“代码>未签名CHAR/<代码>的大小也没有被精确地指定为8位,尽管它在许多平台上是8位。
最好在
color24
中直接使用Uint8
,以避免转换错误。除非您使用的是非常深奥的体系结构,否则无符号字符几乎肯定等同于Uint8
但是代码中有一些问题,尽管还不清楚您到底想做什么或者问题出在哪里
首先,在调用getcolorat()时,您已经转换了x,y坐标。你用i来索引高度,用j来索引宽度,所以你应该用j,i,因此:
Colour24 colour = getColourAt(j, i);
也许使用x,y命名会更简单
其次,对纹理缓冲区的索引是错误的。应该是:
texture[i*width+j+0] = colour.red;
texture[i*width+j+1] = colour.green;
texture[i*width+j+2] = colour.blue;
因为您将有i
完整的width
字节行,而j
字节位于不完整的行上
另外,在SDL\u GetRGB
调用中缺少像素格式,因此这甚至无法编译
最后,getColor()函数无法正常工作;它将始终返回0,0处的像素值,因为您没有在图像中偏移x,y。您可以使用与上面相同的技术进行此操作。只要小心索引,就好像你使用的UInt32和SDL意味着RGBA(32位)像素格式,但你使用的是RGB(24位)。除非你使用的是难以置信的深奥架构,否则无符号字符几乎肯定等同于uint8\t
但是代码中有一些问题,尽管还不清楚您到底想做什么或者问题出在哪里
首先,在调用getcolorat()时,您已经转换了x,y坐标。你用i来索引高度,用j来索引宽度,所以你应该用j,i,因此:
Colour24 colour = getColourAt(j, i);
也许使用x,y命名会更简单
其次,对纹理缓冲区的索引是错误的。应该是:
texture[i*width+j+0] = colour.red;
texture[i*width+j+1] = colour.green;
texture[i*width+j+2] = colour.blue;
因为您将有i
完整的width
字节行,而j
字节位于不完整的行上
另外,在SDL\u GetRGB
调用中缺少像素格式,因此这甚至无法编译
最后,getColor()函数无法正常工作;它将始终返回0,0处的像素值,因为您没有在图像中偏移x,y。您可以使用与上面相同的技术进行此操作。只要小心索引,就好像您使用的UInt32和SDL意味着RGBA(32位)像素格式,但您使用的是RGB(24位)。最后编写了我自己的TGA加载程序,然后发现我需要将高度乘以每个像素的字节。仍然不能100%确定原因(请随意评论),但它现在起作用了
代码:
TGAReader*reader=新的TGAReader();
reader->readSurface(“MyTexture.tga”);
int height=读卡器->高度;
int width=读卡器->宽度;
int bpp=读卡器->bpp;
无符号字符*纹理=新的无符号字符[宽度*高度*bpp];
对于(int y=0;ygetcolorat(x,y);
新织物[索引]=颜色.r;
新织物[指数+1]=颜色.g;
新织物[指数+2]=颜色b;
}
}
//创建OpenGL纹理
unsigned int=createTextureFromData(新纹理、宽度、高度、bpp);
//读取tga数据
彩色阅读器::getcolorat(intx,inty)
{
彩色24 rgb;
r=m_数据[(y*宽度)+x];
rgb.g=m_数据[(y*宽度)+x)+1];
rgb.b=m_数据[(y*宽度)+x)+2];
返回rgb;
}
最终编写了自己的TGA加载程序,然后发现需要将高度乘以每像素字节数。仍然不能100%确定原因(请随意评论),但它现在起作用了
代码:
TGAReader*reader=新的TGAReade