bmp

将缓冲区里的24位、16位、32位的数据转换成RGB565格式的16位颜色值。

24位BMP文件:(rrrrrrrr,gggggggg,bbbbbbbb)蓝色在低地址
16位BMP文件:RGB555-xRRRRRGGGGGBBBBB,RGB565-RRRRRGGGGGGBBBBB,蓝色在低地址
32位BMP文件:(xxxxxxxx,rrrrrrrr,gggggggg,bbbbbbbb)蓝色在低地址,最高那个字节一般不处理。

你这段代码中的color应该是16位颜色,并且是RGB565格式,也就是红色5位,绿色6位,蓝色5位,RRRRRGGGGGGBBBBB。

24位转16位时,蓝色右移3位,是因为需要将8位蓝色转成5位蓝色,绿色先右移2位,是因为从8位转成6位,然后再左移5位,就是移到 RGB565的16位数值的中间的位置上,00000GGGGGG00000,红色右移3位,就是8位转成5位,再左移11位,就是 RRRRR00000000000。

16位转16位,直接将2字节拼接起来。

32位转16位,和24转16位类似,也是需要将8位颜色截短为5位和6位,然后拼起来。pasting

//----------------------------------------------------------
// RGB565 转 8位灰度图
//----------------------------------------------------------
TUint8 gm_red,gm_green,gm_blue;
TInt16 *des_ptr;
TInt16 *pt;
pt = (TInt16 *)p8; //RGB565流

for(TInt j=0;j<h;j++)
{
for(TInt i = w;i>0;i--)
{
gm_red = ((*(TInt16 *)pt) & 0xF800) >> 8;
gm_green = ((*(TInt16 *)pt) & 0x07E0) >> 3;
gm_blue = ((*(TInt16 *)pt) & 0x001F) << 3;
p[0] = ( TUint8 )((gm_red*77+gm_green*150+gm_blue*29+128)/256);
p++;
pt++;
}
}
p = qt; //灰度图指针
 

原文地址:https://www.cnblogs.com/answer/p/1849927.html