void Conv16bit565_TO_24bitRGB(USHORT rgb565, BYTE *r, BYTE *g, BYTE *b)
{
 // 16비트로 RGB를 표현하는 RGB 565에서 R,G,B값을 각각 분리해낸다.
 // 각 비트를보면 다음과 같이 되어있다.
 // RRRRRGGGGGGBBBBB (R: Red, G: Green, B: Blue)

 BYTE red = (rgb565 & 0xF800) >> 11;
 BYTE green = (rgb565 & 0x7E0) >> 5;
 BYTE blue = (rgb565 & 0x1F);

 *r = red << 3;
 *g = green << 2;
 *b = blue << 3;
}

그러므로 24bit -> 16bit -> 24bit 식으로 변환해보면 red, green, blue에서 각각 3,2,3 비트씩 손실이 일어나는 것임을 알 수 있다.
(이렇게 단순히 비트를 죽이는 방법 말고 다른 방법을 쓴다면 조금 더 살릴 수 있을 진 모르겠다.)
RRRRRRRRGGGGGGGGBBBBBBBB 에서
XXXRRRRRXXGGGGGGXXXBBBBB 으로


16bit rgb 555 에서는?

XRRRRRGGGGGBBBBB 이렇게 16bit를 구성 (X는 더미비트)

32bit XRGB 에서는?
XXXXXXXXRRRRRRRRGGGGGGGGBBBBBBBB

Posted by freezn
TAG ,

댓글을 달아 주세요

  1. yoonhok

    궁금한게..
    rgb565 & 0xF800
    rgb565 & 0x7E0
    rgb565 & 0x1F
    굳이 이 작업이 필요한가요?

    상관없이 각각 >> 11, >> 5 처리해주면 되지 않나요?

    2012.01.16 23:56 [ ADDR : EDIT/ DEL : REPLY ]
    • rgb565에서 R,G,B가 각각 정확히 1바이트 씩 먹고 있는게 아니니까요..

      rgb565에서 green 은 6비트만 사용하는데 그냥
      BYTE blue = rgb565>>5 하다면
      RRGGGGGG 처럼 red의 비트가 2개 섞이지요..

      blue도 마찬가지로 GGGBBBBB 로 green의 하위 3비트가 섞이게 되구요..

      red는 큰 의미가 없긴해요. 원래 별 생각없이 uint 로 짰다가 메모리 줄이려고 ushort로 바꿨던거라... ㅎㅎ

      2012.01.20 02:09 신고 [ ADDR : EDIT/ DEL ]