C++ 将Uint8转换为无符号字符RGB值

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

我已经回答了下面的问题。感谢加文布的帮助

问题: 我试图复制一种纹理,只是为了一种学习体验。我使用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 < 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