在我的应用程序中,一旦我将图像加载到SDL_Surface对象中,我需要遍历图像中的每个RGB值,并将其替换为查找函数中的另一个RGB值。
(rNew, gNew, bNew) = lookup(rCur, gCur, bCur);
看起来像surface->像素让我得到像素。如果有人能向我解释如何从像素中获取R,G和B值并将其替换为新的RGB值,我将不胜感激。
答案 0 :(得分:2)
使用内置函数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变量。
答案 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 );