[ 16비트 ]
16비트의 경우는 555와 565모드 두가지가 있습니다.
* 555모드 픽셀 형태
최상위 1비트는 그냥 패딩되는 메모리이며 나머지 15비트는 5비트씩 셋으로 나눠서
RGB값이 각각 들어있는 형태입니다.
* 565모드 픽셀 형태
R : 5비트, G: 6비트, B : 5비트 의 형태로 픽셀이 저장된 것을 말합니다.
16비트 픽셀에서 RGB값을 얻어내려면..
- 555모드
R = Pixel >> 10;
G = Pixel >> 5 & 0x1f;
B = Pixel & 0x1f;
- 565모드
R = Pixel >> 11;
G = Pixel >> 5 & 0x3f;
B = Pixel & 0x1f;
이렇게 분리된 RGB값에 원하는 연산을 해주면 됩니다.
16비트 RGB값을 다시 픽셀로 합치려면..
- 555모드
Pixel = (R << 10) | (G << 5) | (B);
- 565모드
Pixel = (R << 11) | (G << 5) | (B);
[ 24비트 픽셀 형태 ]
픽셀당 3바이트로서.. RGB에 각각 1바이트씩 할당되어 있습니다.
24비트 비트맵의 경우 3바이트 단위로 처리가 되어야 하는데 C는 3바이트단위로
처리할 데이터타입이 없어 사용하기 조금 번거롭습니다.
BYTE *pImg[ImgSize];
for(int i = 0; i < ImgSize; i+=3)
{
R = pImg[i];
G = pImg[i + 1];
B = pImg[i + 2];
// 각 RGB값에 원하는 처리를 해준다.
pImg[i] = R;
pImg[i + 1] = G;
pImg[i + 2] = B;
}
이론상으로는 이코드가 맞겠지만 인텔호환 CPU의 역워드 방식(리틀 엔디안)때문에
아마도 RGB의 순서가 아니라 BGR의 순서로 값이 읽어들여질것입니다.
[ 32비트 픽셀 형태 ]
상위 1바이트는 알파값이며 나머지 3바이트는 24비트 비트맵과 동일한 형태입니다.
LONG형으로 읽어오되.. 상위 1바이트는 무시하고 16비트와 같이 쉬프트연산을
이용하거나 포인터를 char형으로 캐스팅하여 각각의 RGB값에 접근이 가능하겠네요.
'프로그래머의 길 > C & C++' 카테고리의 다른 글
Class Map 사용예제 (0) | 2009.11.30 |
---|---|
string <-> wstring (0) | 2009.07.22 |
자료형 (0) | 2008.05.19 |
비주얼 스튜디오 C++ 단축키 (0) | 2008.05.16 |
DrawText (0) | 2008.05.01 |