[graphic] RGB565와 RGBA8888에 대해서

개발 2013. 6. 19. 02:00

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

android에서 bitmap을 다루다보면 Bitmapconfig 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),

 

처음 이름을 보면 뭔가 했는데, 설명들 보고나니 이름이 그럴 듯하다. 2byte1pixel을 표현하는 방식이고 16bit ( 2byte ) 를 쪼개서 R(5bit), G(6bit), B(5bit) 로 표현하는 방식이다. 2 5승은 32이므로 RedBlue 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_565ARGB_8888으로 변환

16bit RGB 565 형식으로 표현하면 아래처럼 된다.

RRRR RGGG GGGB BBBB

앞의 5bit를 취해서 R 값을 가져오려면 5bit를 가져오기 위해서 0xf8 ( 1111 1000 ) 와 비트연산(&)을 하고 이것을 오른쪽으로 11bit만큼 shift 하면 된다. 나머지 RB도 같은 방식으로 처리하면 된다.

최종코드

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_8888RGB_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 같은곳에 사용된다.

 

 



: