【问题标题】:Greyscale image in SDL2SDL2 中的灰度图像
【发布时间】:2014-12-05 03:15:45
【问题描述】:

我有一个uint8_t 数组,它代表一张灰度图片,其中每个像素都是一个uint8_t。我想在使用 SDL2 库的窗口中显示它。

我试图通过这样做从数组中创建一个 SDL_Surface

mSurface = SDL_CreateRGBSurfaceFrom(mData, mWidth, mHeight, 8, mWidth, 0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000);

但是,问题是当一个 8 位的深度被传递给 SDL_CreateRGBSurfaceFrom 时(就像我在这里所做的那样),根据SDL2 wiki“如果深度是 4 位或 8 位,则为表面分配一个空调色板” 。如果不是这样,我就可以告诉 SDL 每个像素是一个字节,并将该字节用于 R、G 和 B 值。

我想要每像素 8 位的深度,因为我的数据就是这样存储的,但我不想使用调色板。

有什么方法可以让 SDL 不假定我想要一个调色板,而只显示带有 r、g 和 b 掩码都设置为该字节的图像?

我了解另一种解决方案是将我的灰度图像转换为 RGB,方法是将每个字节复制 3 次,然后显示它。但是,如果可能的话,我想避免这样做,因为所有复制都会很慢。

【问题讨论】:

    标签: c++ sdl sdl-2 grayscale surface


    【解决方案1】:

    SDL_CreateRGBSurfaceFrom() 不处理 8 位真彩色格式。如您所述,它为 8 位深度创建了一个空白调色板。最明显的做法是填充调色板,然后让它发挥作用。

    下面是灰度调色板的一些代码:

    SDL_Color colors[256];
    int i;
    
    for(i = 0; i < 256; i++)
    {
        colors[i].r = colors[i].g = colors[i].b = i;
    }
    
    SDL_SetPaletteColors(mSurface->format->palette, colors, 0, 256);
    

    还有一条经验法则:永远不要避免仅仅因为“慢”而起作用的东西。避免“太慢”的事情。您可能只有通过尝试才能知道什么时候“太慢”了。

    在这种情况下,您可能只加载此图像一次,然后您体验到的性能影响可以忽略不计。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-06
      • 1970-01-01
      • 2018-11-28
      • 1970-01-01
      • 1970-01-01
      • 2014-09-15
      • 1970-01-01
      • 2012-06-01
      相关资源
      最近更新 更多