2013-06-24 8 views
0

내 응용 프로그램에서 일단 이미지를 SDL_Surface 객체에로드하면 이미지의 각 RGB 값을 찾아보고 함수의 다른 RGB 값으로 바꿔야합니다.SDL 화면에서 RGB 값을 변경하는 방법은 무엇입니까?

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

픽셀이 픽셀을 가져옵니다. 누군가가 나에게 R, G, B 값을 픽셀로부터 얻고 새로운 RGB 값으로 대체하는 방법을 설명 할 수 있다면 고맙겠습니다.

답변

2

이용 될 수 RGBRGB ... 픽셀 당 32 비트의 배열이 될 수 RGBARGBA 경우 말했듯 내장 함수의 형식과 SDL_GetRGB

#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->formatSDL_MapRGB 거래 당신이 필요가 없습니다.

r, g, b 변수를 별도로 쓰는 대신 SDL_Color을 사용할 수도 있습니다.

+0

그래, R, G, B를 얻는 훨씬 더 좋은 방법, 채널 정렬을 알 필요가 없습니다. – UmNyobe

+0

@UmNyobe 이것은 쉬운 버전입니다. SDL_GetRGB와 SDL_SetRGB 함수는 속도가 느리기 때문에 속도를 원한다면 (일반적으로 전체 화면을 그린 이후부터) 직접 구현해야합니다. –

+0

도와 주셔서 감사합니다. 문안 인사. 베드로 – Peter

0

표면의 형식에 따라 픽셀은 버퍼에 배열로 정렬됩니다. 각 성분은 8 비트이며, 모든 4 화소 안전하게 변경에 대한 데이터를 액세스하기 위해 표면을 잠글 필요 모든

0

우선에게 어디 전형적인 32 비트 서페이스
, 그것은 R G B A R G B A
이다. 이제 배열을 조작하려면 픽셀 당 비트 수와 채널 정렬 (A, R, G, B)을 알아야합니다. 광자가 24이면 배열 .... (푸른 제 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); 
+0

도움 주셔서 감사합니다. 문안 인사. 피터 – Peter

+0

게시물이 유용하다면 upvote :) – UmNyobe

관련 문제