当前位置:天才代写 > tutorial > C语言/C++ 教程 > RGB565与RGB888的转换

RGB565与RGB888的转换

2017-11-03 08:00 星期五 所属: C语言/C++ 教程 浏览:1005

副标题#e#

RGB565的颜色名目RGB555色彩名目是沟通的,除了6位是绿色的代价,

而不是5。因此,所有16位 都在利用。该组织在图像缓冲区的像素是从左至右的权

利,自下而上。

RGB565名目说明:

RGB565彩色模式, 一个像素占两个字节, 个中:第一个字节的前5位用

来暗示R(Red),第一个字 节的后三位+第二个字节的前三位用来暗示G(Green),

第二个字节的后5位用来暗示B(Blue)。

如 :15 14 13 12 11 10 9 8 , 7 6 5 4 3 2 1 0

[RGB565]

0x00??+1 RRRRRGGG

0x00??+0 GGGBBBBB

R 5   0xf8    

G 6   0xe0 0x07

B 5   0x1f

[RGB24]

R G B

addr:1 2 3

对付RGB888来说,每个像素由3个字节构成,R->8bit,G- >8bit,B->8bit;

RGB565 的每个pixels是由2字节构成,R->5bit,G->6bit,B- >5bit。转换的思

路是取出原图的点,对每个采样举办运算。

RGB565

STEP1(第二个 字节) R 取得前5bit  & 0xf8

G 取得后3bit  & 0xe0 并右移5bit 并入R;

STEP2(第一个字节) 取得第4-6bit & 0x1c 并左移3bit 并入B

B 取得前5bit  & 0xf8 并右移3bit 与G中间3位归并

R4  R3  R2  R1  R0  G5  G4  G3 | G2  G1  G0  B4  B3  B2  B1  B0

 A[] 15  14  13  12  11  10   9   8 |  7   6   5   4   3   2   1   0


#p#副标题#e#

下面就以实例来说明问 题:

void RGB565_to_RGB24(unsigned char *source,unsigned char *convert,int width)   

  
{     
    int i;     
    for (i=0 ;i<width ;i++)     
    {     
        * convert++  =  (*source)<<3; /* B */
        * convert++  =  (*(source+1) & 0x07)<<5 | (*source & 0xe0)>>3; 

/* G */
        * convert++  =  *(source+1); /* R */
          source    +=2;     
    }     
}

也可用下面这种要领实现转换,其原理是一样的:

void RGB16toRGB24(unsigned 

char *rgb24,unsigned char *rgb16)     
{     
    int i,j;     
    unsigned short *dot;     
    for(i = 0; i < v_info.xres; i++)     
    {     
        for(j = 0; j < v_info.yres; j++)     
        {     
            dot = (unsigned short *)(rgb16 + i * v_info.yres + j);     
            *rgb24 = (((*dot)&0x01F) << 3);   //R     
            rgb24++;     
            *rgb24 = (((*dot)&0x03E0) >> 2);  //G     
            rgb24++;         
            *rgb24 = (((*dot)&0x7C00) >> 7);  //B     
            rgb24++;             
        }     
    }     
}

本文出自 “驿落薄暮” 博客,请务必保存此出处 http://yiluohuanghun.blog.51cto.com/3407300/860523

 

    关键字:

天才代写-代写联系方式