在我的应用程序中,一旦我将图像加载到 SDL_Surface 对象中,我需要遍历图像中的每个 RGB 值并将其替换为查找函数中的另一个 RGB 值。
(rNew, gNew, bNew) = lookup(rCur, gCur, bCur);
似乎表面->像素让我得到了像素。如果有人能向我解释如何从像素中获取 R、G 和 B 值并将其替换为新的 RGB 值,我将不胜感激。
在我的应用程序中,一旦我将图像加载到 SDL_Surface 对象中,我需要遍历图像中的每个 RGB 值并将其替换为查找函数中的另一个 RGB 值。
(rNew, gNew, bNew) = lookup(rCur, gCur, bCur);
似乎表面->像素让我得到了像素。如果有人能向我解释如何从像素中获取 R、G 和 B 值并将其替换为新的 RGB 值,我将不胜感激。
使用内置函数SDL_GetRGB和SDL_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 变量。
首先,您需要锁定表面以安全地访问数据以进行修改。现在要操作数组,您需要知道每个像素的位数以及通道(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 );
根据表面的格式,像素在缓冲区中排列为数组。
对于典型的 32 位表面,它是 RGBARGBA
,其中每个分量是 8 位,每 4 是一个像素