如何从 SDL_Surface 获取特定像素的颜色? [英] How to get the color of a specific pixel from SDL_Surface?

查看:68
本文介绍了如何从 SDL_Surface 获取特定像素的颜色?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试从 SDL_Surface 获取像素的 RGB/RGBA 颜色.我在互联网上找到了这段代码,但它返回奇怪的数字(67372036 表示像素为 0 红色、0 绿色、255 蓝色)

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

我不确定我的像素是否具有 32 位格式,但其他图片效果不佳.

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

推荐答案

找到了这段代码,它运行良好.

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

这篇关于如何从 SDL_Surface 获取特定像素的颜色?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆