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

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

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

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

我想要每个像素8位的深度,因为那是我的数据存储的方式,但是我不想使用调色板。

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

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

最佳答案

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/

10-15 04:30