Серое изображение в SDL2

У меня есть массив 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, скопировав каждый байт три раза, а затем отобразить его. Однако я хотел бы избежать этого, если это возможно, потому что все это копирование будет медленным.

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

Кроме того, практическое правило: никогда не избегайте того, что работает только потому, что оно «медленное». Избегайте слишком медленных вещей. Вы можете узнать, когда что-то «слишком медленно», попробовав это.

В этом случае вы можете загружать это изображение только один раз, а затем после этого вы ощутите незначительный эффект производительности.

2

Другие решения


По вопросам рекламы [email protected]