Изменение цвета пикселей в SDL

Я делаю игру, в которой используется только PNG с черными и белыми пикселями. Но бывают случаи, когда я хотел бы изменить цвет белых пикселей на что-то другое, например, на зеленый (# 00FF00).

Как мне это сделать?

РЕДАКТИРОВАТЬ: Хорошо, я нашел решение

Вот простая функция для этого:


    void setColor(SDL_Surface *surface, SDL_Color color) {
        Uint16 *pixels = (Uint16 *) surface->pixels;            // Get the pixels from the Surface

        // Iterrate through the pixels and chagne the color
        for (int i = 0; i w * surface->h); i++) {
            if (pixels[i] == SDL_MapRGB(surface->format, 0xFF, 0xFF, 0xFF))        // Search for white pixels
                pixels[i] = SDL_MapRGB(surface->format, color.r, color.b, color.g);
        }
    }

Что нужно иметь в виду, измените «Uint16» на «Uint32», если вы используете 32-битную поверхность, или «Uint8» для 8-битной поверхности.

Я не уверен, насколько быстро этот код, но он выполняет свою работу.


person Benjamin    schedule 24.07.2011    source источник
comment
Вот как это делается, работает со всеми битовыми глубинами, альфа-каналом и т. д. на.   -  person Valmond    schedule 18.02.2012


Ответы (1)


Это зависит от того, что именно вы пытаетесь установить цвет.

Без дополнительной информации на ум сразу приходят два API: «SDL_SetColors ()» и «SDL_SetPalette ()».

Но настоящий ответ - «это зависит от обстоятельств».

person paulsm4    schedule 24.07.2011
comment
Я пробовал SDL_SetColors () и SDL_SetPalette (), у обоих были проблемы. Я придумал метод. - person Benjamin; 24.07.2011
comment
SDL_SetPalette() предназначен только для использования на 8-битных палетированных поверхностях. Если вы знаете, что у вас будет только 256 различных цветов, и вы хотите иметь возможность быстро переключать их, тогда это может быть хорошим вариантом. Однако за кулисами он, вероятно, будет делать что-то похожее на ваш код при отображении 8-битной паллетированной поверхности в вашем 64-битном режиме отображения. - person Null Set; 24.07.2011