본문 바로가기
프로그래머의 길/C & C++

비트맵 파일 RGB 조절

by 제이콥케이 2008. 5. 19.
반응형

[ 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