OpenEdv-开源电子网

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

原子哥,在图片显示中,想将你们的bmp格式的解码函数中得到的像素点存在一个二维数组中,为啥加了一个二维数组就不能显示了,

[复制链接]

2

主题

7

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2017-9-14
在线时间
11 小时
发表于 2018-1-11 15:39:36 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 好心情 于 2018-1-11 15:46 编辑

程序如下:
u8 stdbmp_decode(const u8 *filename)
{
FIL* f_bmp;
    u16 br;
    u16 count;         
u8  rgb ,color_byte;
u16 x ,y,color;   
u16 countpix=0;//记录像素   
//x,y的实际坐标
u16  realx=0;
u16 realy=0;
u8  yok=1;         
u8 res;

u8 *databuf;      //数据读取存放地址
  u16 readlen=BMP_DBUF_SIZE;//一次从SD卡读取的字节数长度
u8 *bmpbuf;      //数据解码地址
u8 biCompression=0;  //记录压缩方式

u16 rowlen;       //水平方向字节数  480
BITMAPINFO *pbmp;  //临时指针

  unsigned char ImgData1[320][480];    //这里定义的二维数组

#if BMP_USE_MALLOC == 1 //使用malloc
databuf=(u8*)pic_memalloc(readlen);  //开辟readlen字节的内存区域
if(databuf==NULL)return PIC_MEM_ERR; //内存申请失败.
f_bmp=(FIL *)pic_memalloc(sizeof(FIL)); //开辟FIL字节的内存区域
if(f_bmp==NULL)       //内存申请失败.
{   
  pic_memfree(databuf);
  return PIC_MEM_ERR;   
}   
#else      //不使用malloc
databuf=bmpreadbuf;
f_bmp=&f_bfile;
#endif
res=f_open(f_bmp,(const TCHAR*)filename,FA_READ);//打开文件         
if(res==0)//打开成功.
{
  f_read(f_bmp,databuf,readlen,(UINT*)&br); //读出readlen个字节  
  pbmp=(BITMAPINFO*)databuf;     //得到BMP的头部信息   
  count=pbmp->bmfHeader.bfOffBits;         //数据偏移,得到数据段的开始地址
  color_byte=pbmp->bmiHeader.biBitCount/8; //彩色位 16/24/32  
  biCompression=pbmp->bmiHeader.biCompression;//压缩方式
  picinfo.ImgHeight=pbmp->bmiHeader.biHeight; //得到图片高度
  picinfo.ImgWidth=pbmp->bmiHeader.biWidth;   //得到图片宽度
  ai_draw_init();//初始化智能画图   
  //水平像素必须是4的倍数!!
  if((picinfo.ImgWidth*color_byte)%4)rowlen=((picinfo.ImgWidth*color_byte)/4+1)*4;
  else rowlen=picinfo.ImgWidth*color_byte;//480
  //开始解码BMP   
  color=0;//颜色清空               
  x=0 ;
  y=picinfo.ImgHeight;//320
  rgb=0;      
  //对于尺寸小于等于设定尺寸的图片,进行快速解码
  realy=(y*picinfo.Div_Fac)>>13;
  bmpbuf=databuf;
  while(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
       {
          ImgData1[y-1][2*x]=bmpbuf[count];          //就是这里加了一个二维数组
//        color=ImgData1[y-1][2*x+rgb];     //G,B
        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
       {
         ImgData1[y-1][2*x+1]=bmpbuf[count];   //就是这里加了一个二维数组
//        color+=(u16)ImgData1[y-1][2*x+rgb]<<8; //R,G      
        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位色,暂时不支持,需要用到颜色表.
    {
    }
    rgb++;   
    count++ ;   
    if(rgb==color_byte) //水平方向读取到1像素数数据后显示
    {
     if(x<picinfo.ImgWidth)              
     {
      realx=(x*picinfo.Div_Fac)>>13;//x轴实际值
      if(is_element_ok(realx,realy,1)&&yok)//符合条件
      {                       
       pic_phy.draw_point(realx+picinfo.S_XOFF,realy+picinfo.S_YOFF-1,color);//显示图片
       //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);
      }               
     }
     x++;//x轴增加一个像素
     color=0x00;
     rgb=0;      
    }
    countpix++;//像素累加(字节累加)
    if(countpix>=rowlen)//水平方向像素值到了.换行
    {   
     y--;
     if(y==0)break;   
     realy=(y*picinfo.Div_Fac)>>13;//实际y值改变  
     if(is_element_ok(realx,realy,0))yok=1;//此处不改变picinfo.staticx,y的值  
     else yok=0;
     x=0;
     countpix=0;
     color=0x00;
     rgb=0;
    }  
   }   
   res=f_read(f_bmp,databuf,readlen,(UINT *)&br);//读出readlen个字节
   if(br!=readlen)readlen=br; //最后一批数据   
   if(res||br==0)break;  //读取出错
   bmpbuf=databuf;
     count=0;
  }  
  f_close(f_bmp);//关闭文件
}   

最佳答案

查看完整内容[请看2#楼]

我没细看你这函数,你把大数组在外部定义成全局。函数里边定义的变量是在栈区里的,一般栈区很小。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

56

主题

343

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-3-8
在线时间
267 小时
发表于 2018-1-11 15:39:37 | 显示全部楼层
好心情 发表于 2018-1-11 17:12
大神你好,就是想把320x240个像素点都存在一个数组里面,如果这样不行的,应该怎么去处理了

我没细看你这函数,你把大数组在外部定义成全局。函数里边定义的变量是在栈区里的,一般栈区很小。
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2017-9-14
在线时间
11 小时
 楼主| 发表于 2018-1-11 16:27:10 | 显示全部楼层
哪位大神知道的指导一下,非常感谢
回复

使用道具 举报

56

主题

343

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-3-8
在线时间
267 小时
发表于 2018-1-11 16:57:41 | 显示全部楼层
我且先不开这函数有没有问题,你在函数里 unsigned char ImgData1[320][480]; 就是很大的问题。。。。。。。。这数组100+KB呐。栈区没这么大吧
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2017-9-14
在线时间
11 小时
 楼主| 发表于 2018-1-11 17:12:51 | 显示全部楼层
pdwdzz 发表于 2018-1-11 16:57
我且先不开这函数有没有问题,你在函数里 unsigned char ImgData1[320][480]; 就是很大的问题。。。。。。 ...

大神你好,就是想把320x240个像素点都存在一个数组里面,如果这样不行的,应该怎么去处理了
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2017-9-14
在线时间
11 小时
 楼主| 发表于 2018-1-11 18:06:26 | 显示全部楼层
pdwdzz 发表于 2018-1-11 17:18
我没细看你这函数,你把大数组在外部定义成全局。函数里边定义的变量是在栈区里的,一般栈区很小。

哦哦,感谢大神的指点
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-19 19:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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