c++ - SDL2 中的灰度图像

标签 c++ sdl sdl-2 grayscale surface

我有一个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,然后显示它。但是,如果可能的话,我想避免这样做,因为所有复制都会很慢。

最佳答案

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);

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

在这种情况下,您可能只加载该图像一次,之后您会遇到可以忽略不计的性能影响。

关于c++ - SDL2 中的灰度图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27204397/

相关文章:

Visual Studio 上调用堆栈的 C++ Getters 和 Setters 替代方案

c++ - 在 C++ 中存储类型

c++ - 调整 SDL2 窗口大小?

c++ - 无法初始化 OpenGL

c++ - 无法在窗口中正确 reshape 多边形

C++队列容器

c - 杀死 SDL 2 线程 (C)

更改颜色 TTF 文本 SDL C

c++ - 我在链接 SDL 库时遇到问题

c++ - 在中心位置渲染模型不显示(修订)