SDL2中的灰度图像

时间:2014-11-29 16:28:17

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

1 个答案:

答案 0 :(得分:2)

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

另外,一条经验法则:永远不要避免只是为了“慢慢”而做的事情。避免过于缓慢的事情&#34;。你可能只知道什么时候发生的事情太慢了#34;尝试一下。

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