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
 
下面就以实例来说明问题:

 

  1. void RGB565_to_RGB24(unsigned char *source,unsigned char *convert,int width)  
  2. {  
  3.     int i;  
  4.     for (i=0 ;i<width ;i++)  
  5.     {  
  6.         * convert++  =  (*source)<<3; /* B */ 
  7.         * convert++  =  (*(source+1) & 0x07)<<5 | (*source & 0xe0)>>3; /* G */ 
  8.         * convert++  =  *(source+1); /* R */ 
  9.           source    +=2;  
  10.     }  
也可用下面这种方法实现转换,其道理是一样的:
  1. void RGB16toRGB24(unsigned char *rgb24,unsigned char *rgb16)  
  2. {  
  3.     int i,j;  
  4.     unsigned short *dot;  
  5.     for(i = 0; i < v_info.xres; i++)  
  6.     {  
  7.         for(j = 0; j < v_info.yres; j++)  
  8.         {  
  9.             dot = (unsigned short *)(rgb16 + i * v_info.yres + j);  
  10.             *rgb24 = (((*dot)&0x01F) << 3);   //R  
  11.             rgb24++;  
  12.             *rgb24 = (((*dot)&0x03E0) >> 2);  //G  
  13.             rgb24++;      
  14.             *rgb24 = (((*dot)&0x7C00) >> 7);  //B  
  15.             rgb24++;          
  16.         }  
  17.     }