[graphic] RGB565와 RGBA8888에 대해서
개발 2013. 6. 19. 02:00android에서 bitmap을 다루다보면 Bitmap의 config에 bitmap의 픽셀포멧을 표시하는 부분 있다.
ALPHA_8, RGB_565, ARGB_4444, ARGB_8888 이렇게 4가지가 있는데 주로 사용되는 RGB_565와 ARGB_8888에 대해서 알아보자.
1. RGB_565
/**
* Each pixel is stored on 2 bytes and only the RGB channels are
* encoded: red is stored with 5 bits of precision (32 possible
* values), green is stored with 6 bits of precision (64 possible
* values) and blue is stored with 5 bits of precision.
*
* This configuration may be useful when using opaque bitmaps
* that do not require high color fidelity.
*/
RGB_565 (4),
처음 이름을 보면 뭔가 했는데, 설명들 보고나니 이름이 그럴 듯하다. 2byte로 1pixel을 표현하는 방식이고 16bit ( 2byte ) 를 쪼개서 R(5bit), G(6bit), B(5bit) 로 표현하는 방식이다. 2의 5승은 32이므로 Red와 Blue는 32가지의 구분정밀도를 갖게되어 색 표현력은 적은 단점이 있으면서, 용량이 작아지는 장점이 있다.
2. ARGB_8888
/**
* Each pixel is stored on 4 bytes. Each channel (RGB and alpha
* for translucency) is stored with 8 bits of precision (256
* possible values.)
*
* This configuration is very flexible and offers the best
* quality. It should be used whenever possible.
*/
ARGB_8888
한 pixel을 4byte를 이용해서 우수한 색 표현을 하게 된다. ( 256*256*256=16,777,216 색 표현가능) 각 색별로 1byte씩 사용하고 있어서 개발시에도 다루기 편하다.
3. RGB_565을 ARGB_8888으로 변환
16bit로 RGB를 565 형식으로 표현하면 아래처럼 된다.
RRRR RGGG GGGB BBBB
앞의 5bit를 취해서 R 값을 가져오려면 5bit를 가져오기 위해서 0xf8 ( 1111 1000 ) 와 비트연산(&)을 하고 이것을 오른쪽으로 11bit만큼 shift 하면 된다. 나머지 R과 B도 같은 방식으로 처리하면 된다.
최종코드
int RGB565_to_ARGB8(short rgb565)
{
int a = 0xff;
int r = (rgb565 & 0xf800) >> 11;
int g = (rgb565 & 0x07e0) >> 5;
int b = (rgb565 & 0x001f);
r = r << 3;
g = g << 2;
b = b << 3;
return (a << 24) | (r << 16) | (g << 8) | (b);
}
4. ARGB_8888을 RGB_565으로 변환
위와 비슷하게 비트연산을 해주면된다.
short ARGB8_to_RGB565(int argb)
{
int a = (argb & 0xFF000000) >> 24;
int r = (argb & 0x00FF0000) >> 16;
int g = (argb & 0x0000FF00) >> 8;
int b = (argb & 0x000000FF);
r = r >> 3;
g = g >> 2;
b = b >> 3;
return (short) (b | (g << 5) | (r << (5 + 6)));
}
5. 기타
다른 형식으로 RGBA_4444가 있는데, 4bit씩 해서 16bit으로 색을 표현하는 방식인데, deprecated 되어서 사용되지 않는다. Alpha 비트를 빼면 4096 색을 표현할 수 있다. ( 16*16*16 )
나머지 형식인 ALPHA_8은 한 pixcel에 투명정보(8bit)만 있는 형식인데, 투명 mask 같은곳에 사용된다.