2013-09-03 2 views
0

원본 이미지와 비교할 이미지의 빨간색 채널을 생성 할 수있는 특정 기능이 있습니까?적색 채널을 추출하는 SDL 라이브러리

+0

SDL은 실제로 이미지 처리 라이브러리가 아닙니다. – jrok

+0

SDL로 무엇을 할 수 있습니까? 해당 적색 채널 또는 녹색 채널을 생성 할 수 있습니까? – user2711681

답변

2

surface->pixels으로 픽셀 데이터에 액세스하고 surface->format->Rmask으로 그림 Rmask에 액세스 할 수 있습니다. 데이터

를 추출하는 비트 연산으로 봐
SDL_Surface* t; 
//Code 
Uint32* pixels = (Uint32*)t->pixels; 
int x = 10 ,y = 10; //For pixel at 10, 10 
Uint32* MyPixel = pixels + ((y-1) + t->w) + x; 

Uint32 RedOnly = *MyPixel & t->format->Rmask; 

참고 :이 바보 같은 실수와 y-y를 하나해야 잊어 버렸습니다. 이런

Uint32* MyPixel = pixels + ((y-1) + t->w) + x 방법 :

UINT32 픽셀 데이터의 배열의 첫 번째 요소를 가리키는 포인터이다. (32 비트 정수). 내가 픽셀 +1을하면 도로 아래로 1 Uint32 크기의 메모리가 보입니다. 2D 좌표계에서 픽셀 10,10을 원한다면이를 1 차원 선형 값으로 변환해야합니다.

1,2,3,4,5 
6,7,8,9,10 

그래서 ((y-1) * t->w) + x는 lineaer 형태의 픽셀의 정수 값을 얻을 것이다 : 그것은 간다 있도록 SDL_Surface 픽셀은 수평 및 선형이다. 예를 들어 위의 경우 2,2와 같은 픽셀의 경우 너비는 5이고 은 7이됩니다. 그런 다음 픽셀을 가져 와서 배열의 원점에서 Uint32 (7 * 32 비트) 7 정수의 주소 인 7 ( pixels+7)만큼 오프셋합니다.

Uint32 RedOnly = *MyPixel & t->format->Rmask은 다음과 같이 작동합니다. 픽셀 (0xFF41A401)에 임의의 Uint32가 있다고 가정 해 보겠습니다. 그림 형식이 ARGB라고 가정 해 보겠습니다. 즉, Rmask는 0x00FF0000입니다. 그 진에서
는 빨간색 값은 그래서 '삭제'모든 블루/그린 정보 유지, 따라서

*MyPixel = 1111 1111 0100 0001 1010 0100 0000 0001 
Rmask = 0000 0000 1111 1111 0000 0000 0000 0000 

//And a bitwise & operation will result in: 

RedOnly = 0000 0000 0100 0001 0000 0000 0000 0000 

이다.

+0

t-> w 란 무엇입니까? 이 함수가이 경우 http://wiki.libsdl.org/SDL_CreateRGBSurface에 적합하다는 것을 알았습니까? – user2711681

+1

t-> w는 'surface-> w'또는 표면의 픽셀 수의 너비입니다. 'surface-> h '는 높이이지만 필요하지 않습니다. '(y + t -> w) + x는 x, y 좌표를 픽셀의 선형 값으로 바꾼다. – Chemistpp

+0

그래서 for 루프를 실행해야하지만 그 전에 w와 h 값을 적절하게 받아야합니다. 하지만 처음에는이 변수에있는 모든 픽셀을 가지고 있습니까? 그러면 여기에서 여러분이하는 것은 명확한 픽셀이 아닙니다 + (y + t -> w) + x; – user2711681

관련 문제