OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3919|回复: 5

bmp图片解码求助大神、原子哥

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2013-6-29
在线时间
0 小时
发表于 2013-7-22 15:36:11 | 显示全部楼层 |阅读模式
看了原子哥的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);
      }               
     }
暂时先问这么多,后续继续学习再来请教大家了!!
          
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-7-22 15:55:56 | 显示全部楼层
第一个问题,不多说,直接看BMP解码文档说明,网上很多人都发过,我们光盘也有,好好读读这类原理性的文章,有助于你理解。
第二个问题,这是因为单片机计算浮点数,需要更长的运算时间,而转换成整数,可以大大节省时间。这里扩大缩小,就是这个意思,避免浮点运算。
偏移就是为了让图片显示在液晶的最中央。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2013-6-29
在线时间
0 小时
 楼主| 发表于 2013-7-22 20:21:41 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
懂了,谢谢原子哥!!
回复 支持 反对

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2016-3-25
在线时间
19 小时
发表于 2016-8-10 08:38:28 | 显示全部楼层
Chili 发表于 2013-7-22 20:21
回复【2楼】正点原子:
---------------------------------
懂了,谢谢原子哥!!

大神我也不懂你说的这两个问题,你有时间了,赐教下
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-11-12
在线时间
2 小时
发表于 2019-11-19 21:46:51 | 显示全部楼层
这个怎么灰度化图片
回复 支持 反对

使用道具 举报

40

主题

137

帖子

0

精华

高级会员

Rank: 4

积分
579
金钱
579
注册时间
2019-8-4
在线时间
187 小时
发表于 2020-1-2 15:46:58 | 显示全部楼层
(x*picinfo.Div_Fac)>>13
这个X不是整数吗,你们在聊的什么
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-20 11:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表