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
下面就以实例来说明问题:
也可用下面这种方法实现转换,其道理是一样的:
- 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++;
- }
- }
- }