如何更改SDL表面中的RGB值?

时间:2013-06-24 07:56:14

标签: sdl

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

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

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

3 个答案:

答案 0 :(得分: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变量。

答案 1 :(得分:0)

根据曲面的格式,像素在缓冲区中排列为数组 对于典型的32位表面,它是R G B A R G B A
其中每个组件是8位,每4个是一个像素

答案 2 :(得分: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 );