如何将SDL_surface转换为uint8_t数组?

时间:2018-01-14 18:49:58

标签: c++ sdl-2

我正在尝试将SDL_surface转换为我自己的Color结构:

struct Color
{
    uint8_t r, g, b, a;

    explicit Color(const uint8_t p_r = 0, const uint8_t p_g = 0, const float uint8_t = 0, const uint8_t p_a = 255);
};

我要做的是:

  1. 将png文件加载到SDL_Surface。

    SDL_Surface * img = IMG_Load("pngfilePath.png");
    
  2. 将SDL_Surfaceformat转换为RGBA格式

    SDL_Surface * rgbaImage = SDL_ConvertSurfaceFormat(img, SDL_PIXELFORMAT_RGBA32, 0);
    
  3. 将内存分配给我的“颜色”数组

    Color *palette = new Color[rgbaImage->w * rgbaImage->h];
    
  4. 最后,我想将所有png颜色信息复制到我的“颜色”数组中。

    我现在正处于这个阶段。

    uint32_t* pixels = static_cast<uint32_t *>(rgbaImage->pixels);
    uint8_t r, g, b, a;
    for(int i = 0; i < rgbaImage->h; ++i)
    {
        for(int j = 0; j < rgbaImage->w; ++j)
        {
            SDL_GetRGBA(pixels[j + i * rgbaImage->w],
                rgbaImage->format, &r, &g, &b, &a);
    
            palette[j + i * rgbaImage->w].r = r;
            palette[j + i * rgbaImage->w].g = g;
            palette[j + i * rgbaImage->w].b = b;
            palette[j + i * rgbaImage->w].a = a;
        }
    }
    

    这就是我想将所有信息保存到我的“颜色”结构中的方法。

  5. 有更有效的方法吗?似乎SDL_GetRGBA功能很慢。

0 个答案:

没有答案