내 응용 프로그램에서 일단 이미지를 SDL_Surface 객체에로드하면 이미지의 각 RGB 값을 찾아보고 함수의 다른 RGB 값으로 바꿔야합니다.SDL 화면에서 RGB 값을 변경하는 방법은 무엇입니까?
(rNew, gNew, bNew) = lookup(rCur, gCur, bCur);
픽셀이 픽셀을 가져옵니다. 누군가가 나에게 R, G, B 값을 픽셀로부터 얻고 새로운 RGB 값으로 대체하는 방법을 설명 할 수 있다면 고맙겠습니다.
내 응용 프로그램에서 일단 이미지를 SDL_Surface 객체에로드하면 이미지의 각 RGB 값을 찾아보고 함수의 다른 RGB 값으로 바꿔야합니다.SDL 화면에서 RGB 값을 변경하는 방법은 무엇입니까?
(rNew, gNew, bNew) = lookup(rCur, gCur, bCur);
픽셀이 픽셀을 가져옵니다. 누군가가 나에게 R, G, B 값을 픽셀로부터 얻고 새로운 RGB 값으로 대체하는 방법을 설명 할 수 있다면 고맙겠습니다.
이용 될 수 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->format
SDL_MapRGB 거래 당신이 필요가 없습니다.
r, g, b 변수를 별도로 쓰는 대신 SDL_Color을 사용할 수도 있습니다.
표면의 형식에 따라 픽셀은 버퍼에 배열로 정렬됩니다. 각 성분은 8 비트이며, 모든 4 화소 안전하게 변경에 대한 데이터를 액세스하기 위해 표면을 잠글 필요 모든
우선에게 어디 전형적인 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);
그래, R, G, B를 얻는 훨씬 더 좋은 방법, 채널 정렬을 알 필요가 없습니다. – UmNyobe
@UmNyobe 이것은 쉬운 버전입니다. SDL_GetRGB와 SDL_SetRGB 함수는 속도가 느리기 때문에 속도를 원한다면 (일반적으로 전체 화면을 그린 이후부터) 직접 구현해야합니다. –
도와 주셔서 감사합니다. 문안 인사. 베드로 – Peter