У меня есть массив uint8_t
которая представляет изображение в градациях серого, где каждый пиксель равен единице uint8_t
, Я хотел бы отобразить это в окне, используя библиотеку SDL2.
Я попытался создать SDL_Surface из массива, выполнив
mSurface = SDL_CreateRGBSurfaceFrom(mData, mWidth, mHeight, 8, mWidth, 0xFF0000, 0xFF0000, 0xFF0000, 0xFF0000);
Однако проблема заключается в том, что, когда глубина 8 битов передается в SDL_CreateRGBSurfaceFrom (как я сделал здесь), в соответствии с SDL2 вики «Если глубина равна 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);
Кроме того, практическое правило: никогда не избегайте того, что работает только потому, что оно «медленное». Избегайте слишком медленных вещей. Вы можете узнать, когда что-то «слишком медленно», попробовав это.
В этом случае вы можете загружать это изображение только один раз, а затем после этого вы ощутите незначительный эффект производительности.