1

在我的应用程序中,一旦我将图像加载到 SDL_Surface 对象中,我需要遍历图像中的每个 RGB 值并将其替换为查找函数中的另一个 RGB 值。

 (rNew, gNew, bNew) = lookup(rCur, gCur, bCur);

似乎表面->像素让我得到了像素。如果有人能向我解释如何从像素中获取 R、G 和 B 值并将其替换为新的 RGB 值,我将不胜感激。

4

3 回答 3

2

使用内置函数SDL_GetRGBSDL_MapRGB

#include <stdint.h>

/*
...
*/

short int x = 200 ;
short int y = 350 ;

uint32_t pixel = *( ( uint32_t * )screen->pixels + y * screen->w + x ) ;

uint8_t r ;
uint8_t g ;
uint8_t b ;

SDL_GetRGB( pixel, screen->format ,  &r, &g, &b );

screen->format处理格式,所以你不必。

您也可以使用SDL_Color而不是单独编写 r,g,b 变量。

于 2013-06-24T08:28:49.040 回答
0

首先,您需要锁定表面以安全地访问数据以进行修改。现在要操作数组,您需要知道每个像素的位数以及通道(A、R、G、B)的对齐方式。正如 Photon 所说,如果每像素 32 位,则阵列可以是 RGBARGBA....如果是 24,则阵列可以是 RGBRGB....(也可以是 BGR、BGR、蓝色优先)

//i assume the signature of lookup to be
int lookup(Uint8 r, Uint8 g, Uint8 b, Uint8 *rnew, Uint8* gnew, Uint8* bnew);

SDL_LockSurface( surface );

/* Surface is locked */
/* Direct pixel access on surface here */
Uint8 byteincrement  = surface->format->BytesPerPixel;

int position;
for(position = 0; position < surface->w * surface->h* byteincrement; position += byteincrement  )
{
    Uint8* curpixeldata = (Uint8*)surface->data + position;
    /* assuming RGB, you need to know the position of channels otherwise the code is overly complex. for instance, can be BGR */
    Uint8* rdata = curpixeldata +1;
    Uint8* gdata = curpixeldata +2;
    Uint8* bdata = curpixeldata +3;
    /* those pointers point to r, g, b, use it as you want */
    lookup(*rdata, *gdata, *bdata, rdata,gdata,bdata);
}

.
SDL_LockSurface( surface );
于 2013-06-24T08:23:29.043 回答
0

根据表面的格式,像素在缓冲区中排列为数组。
对于典型的 32 位表面,它是 RGBARGBA
,其中每个分量是 8 位,每 4 是一个像素

于 2013-06-24T07:59:36.240 回答