中级会员
 
- 积分
- 233
- 金钱
- 233
- 注册时间
- 2021-5-7
- 在线时间
- 102 小时
|
1金钱
代码
while(count<readlen) //读取一簇1024扇区 (SectorsPerClust 每簇扇区数)
{
if(color_byte==3) //24位颜色图
{
switch (rgb)
{
case 0:
color=bmpbuf[count]>>3; //B
break ;
case 1:
color+=((u16)bmpbuf[count]<<3)&0X07E0;//G
break;
case 2 :
color+=((u16)bmpbuf[count]<<8)&0XF800;//R
break ;
}
}else if(color_byte==2) //16位颜色图
{
switch(rgb)
{
case 0 :
if(biCompression==BI_RGB)//RGB:5,5,5
{
color=((u16)bmpbuf[count]&0X1F); //R
color+=(((u16)bmpbuf[count])&0XE0)<<1; //G
}else //RGB:5,6,5
{
color=bmpbuf[count]; //G,B
}
break ;
case 1 :
if(biCompression==BI_RGB)//RGB:5,5,5
{
color+=(u16)bmpbuf[count]<<9; //R,G
}else //RGB:5,6,5
{
color+=(u16)bmpbuf[count]<<8; //R,G
}
break ;
}
}else if(color_byte==4)//32位颜色图
{
switch (rgb)
{
case 0:
color=bmpbuf[count]>>3; //B
break ;
case 1:
color+=((u16)bmpbuf[count]<<3)&0X07E0;//G
break;
case 2 :
color+=((u16)bmpbuf[count]<<8)&0XF800;//R
break ;
case 3 :
//alphabend=bmpbuf[count];//不读取 ALPHA通道
break ;
}
}else if(color_byte==1)//8位色,暂时不支持,需要用到颜色表.
{
}
这是我在文档里找到的内容:
biBitCount=16表示位图最多有 216 种颜色。每个色素用 16 位(2 个字节)表示。这种格式叫作高彩色,或叫增强型 16 位色,或 64K 色。它的情况比较复杂,当 biCompression 成员
的值是 BI_RGB 时,它没有调色板。16 位中,最低的 5 位表示蓝色分量,中间的 5 位表示绿色分量,高的 5 位表示红色分量,一共占用了 15 位,最高的一位保留,设为 0。这种格式也被称作 55516 位位图。
color_byte==2也就是16位颜色图那里,从逻辑上看是先把第一个字节读出来,低5位是蓝色(可注释为什么是R?是不是写错了?),剩下的高3位取出来左移1位是绿色的一部分(也就是6到8位,最低位是第0位),再读第二个字节,左移9位,就是最高位不要,之后高5位是红色,剩下的低两位与前面3位一起组成绿色。所以结果就是低5位是蓝色(0到4位),第5位为0,6到10位是绿色,11到15位是红色。这与文档说的不对啊,文档说了“最低的 5 位表示蓝色分量,中间的 5 位表示绿色分量,高的 5 位表示红色分量,一共占用了 15 位,最高的一位保留,设为 0。”为什么程序是第5位为0而不是最高位为0呢?
还有个疑问,第一次读第一个字节时是作为0到7位来处理的,第二次是作为8到15位来处理的,为什么不是反过来的?跟什么有关?
|
-
-
最佳答案
查看完整内容[请看2#楼]
电路上移位,以51单片机为例:P0口的0~6脚分别接P1口的1~7脚,P1.0接地,然后运行,
P0=x;
y=P1;
就相当于是y=x
|