Search code examples
c++sdl

How to get the color of a specific pixel from SDL_Surface?


I'm trying to get the RGB/RGBA color of pixels from a SDL_Surface. I've found this code on the internet but it returns strange numbers (67372036 for a pixel that is 0 red, 0 green, 255 blue)

Uint32 get_pixel32(SDL_Surface *surface, int x, int y)
{
    Uint32 *pixels = (Uint32 *)surface->pixels;
    return pixels[(y * surface->w) + x];
}

This it the code I've been using:

Uint32 data = get_pixel32(gSurface, 0, 0);
printf("%i", data);

I'm not sure if my pixels have a 32bit format but other pictures didn't work as well.


Solution

  • Found this code and it's working fine.

    Uint32 getpixel(SDL_Surface *surface, int x, int y)
    {
        int bpp = surface->format->BytesPerPixel;
        /* Here p is the address to the pixel we want to retrieve */
        Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;
    
    switch (bpp)
    {
        case 1:
            return *p;
            break;
    
        case 2:
            return *(Uint16 *)p;
            break;
    
        case 3:
            if (SDL_BYTEORDER == SDL_BIG_ENDIAN)
                return p[0] << 16 | p[1] << 8 | p[2];
            else
                return p[0] | p[1] << 8 | p[2] << 16;
                break;
    
            case 4:
                return *(Uint32 *)p;
                break;
    
            default:
                return 0;       /* shouldn't happen, but avoids warnings */
          }
    }
    
    
    
    SDL_Color rgb;
    Uint32 data = getpixel(gSurface, 200, 200);
    SDL_GetRGB(data, gSurface->format, &rgb.r, &rgb.g, &rgb.b);