新手入门
- 积分
- 26
- 金钱
- 26
- 注册时间
- 2013-6-29
- 在线时间
- 0 小时
|
看了原子哥的bmp解码程序,有些许疑惑:黄色部分是疑问和个人理解
问题1: bmp颜色数据解析
if(color_byte==3) //24位颜色图 5,6,5 因为液晶是16位的,所以最多只能取16位565格式。(大于16的也取16位)理解对吗?
{
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位颜色图 这里的16位色图555的排列不解,我了解到的排列方式是RGB[14:0],最高位忽略。
{
switch(rgb)
{
case 0 :
if(biCompression==BI_RGB)//RGB:5,5,5 //可是原子哥的这里程序并不是这样解码的,看程序意思是RGB顺序排列着,但把第6位空着。为何与16位555格式标准不一致?
{
color=((u16)bmpbuf[count]&0X1F); //R
color+=(((u16)bmpbuf[count])&0XE0)<<1; //G
}else //RGB:5,6,5 //其它就这样处理(BGR排列)??
{
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 ;
}
}
问题2:显示图片的放大倍数与显示点函数
if(rgb==color_byte) //水平方向读取到1像素数数据后显示
{
if(x<picinfo.ImgWidth)
{
realx=(x*picinfo.Div_Fac)>>13;//x轴实际值 之前乘上2的13次方,现在有除以它,一前一后有什么意义??
if(is_element_ok(realx,realy,1)&&yok)//符合条件
{
pic_phy.draw_point(realx+picinfo.S_XOFF,realy+picinfo.S_YOFF,color);//显示图片 实际显示的区域应该是从realx,realy开始嘛,这里为何又要加上S_XOFF(之前初始化为区域的一半,为何这样做??)
//POINT_COLOR=color;
//LCD_DrawPoint(realx+picinfo.S_XOFF,realy+picinfo.S_YOFF);
//SRAMLCD.Draw_Point(realx+picinfo.S_XOFF,realy+picinfo.S_YOFF,color);
}
}
暂时先问这么多,后续继续学习再来请教大家了!!
|
|