OpenEdv-开源电子网

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

BMP解码图片显示异常,求助下各位

[复制链接]

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2016-4-23
在线时间
15 小时
发表于 2016-5-21 13:43:16 | 显示全部楼层 |阅读模式
5金钱
因为手上有一块2.4寸SPI(RGB 6-6-6)接口的显示屏,因为只显示BMP图片,也不需要像例程中对RGB做处理,所以把代码阉割了下,调试后终于显示出来了,但是显示的图片在中间有一长串锯齿状图案如下图:
原图跟代码我附在2楼,请各位大神帮忙看看!

823178474416275529.jpg
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2016-4-23
在线时间
15 小时
 楼主| 发表于 2016-5-21 13:46:27 | 显示全部楼层
[mw_shl_code=c,true]bmpinfo BmpInfoX;
uint8_t bmpDecode(uint8_t *picname)
{
        FIL *bmpFile;
        FRESULT status;
        //BMPINFOX *pbmptemp;
        BMPINFOHEADERX bmpinfoheadx;
        BMPFILEHEADERX bmpfileheadx;       
        uint8_t cnt;
        uint8_t bitcount;
        uint8_t bittype;
        uint8_t *databuff;
        uint8_t bmpbuff[3];
        uint16_t i,j,k;       
       
        printf("\r\n ×¼±¸½âÂëBMPͼƬ");
        databuff = (uint8_t *)Malloc(LCD_WIDTH*3);
        if(!databuff) return PIC_MEM_ERR;
        bmpFile=(FIL *)Malloc(sizeof(FIL));
        if(!bmpFile)
        {
                MemoryFree(databuff);
                return PIC_MEM_ERR;
        }
                printf("\r\n ÄÚ´æ·ÖÅä³É¹¦");
        status = f_open(bmpFile,(const TCHAR *)picname,FA_READ|FA_OPEN_EXISTING);
        if(status==FR_OK)
        {
                status = f_read(bmpFile,&bmpfileheadx,sizeof(BMPFILEHEADERX),(UINT *)&cnt);
                        if(status!=FR_OK) return PIC_READ_ERR;
                status = f_read(bmpFile,&bmpinfoheadx,sizeof(BMPINFOHEADERX),(UINT *)&cnt);
                        if(status!=FR_OK) return PIC_READ_ERR;       
               
                bitcount =bmpfileheadx.bfOffBits;
                bittype = bmpinfoheadx.biBitCount/8;
                BmpInfoX.bmpWidth = bmpinfoheadx.biWidth;
                BmpInfoX.bmpHeight = bmpinfoheadx.biHeight;
                printf("\r\nÆ«ÒÆÁ¿=%d",bitcount);
                printf("\r\nͼÏñÀàÐÍ=%d",bittype);
                printf("\r\nͼÏñ¸ß¶È=%d",BmpInfoX.bmpHeight);
                printf("\r\nͼÏñ¿í¶È=%d",BmpInfoX.bmpWidth);               
                if((BmpInfoX.bmpWidth*bittype)%4) BmpInfoX.index = ((BmpInfoX.bmpWidth*bittype)/4+1)*4;
                        else        BmpInfoX.index = BmpInfoX.bmpWidth*bittype;
                printf("\r\nͼÏñʵ¼Ê¿í¶È=%d",BmpInfoX.index);                               
                if(bittype >= 3)
                {
                        printf("\r\nͼÏñÊÇ24λÕæ²Êͼ");                               
       for(i=0;i<LCD_HEIGHT; i++)
        {   
            if(LCD_WIDTH>BmpInfoX.bmpWidth)
            {            
                                                                printf("\r\n&AElig;&Aacute;&Auml;&raquo;&iquest;í&para;&Egrave;&acute;ó&Oacute;&Uacute;&Iacute;&frac14;&AElig;&not;&iquest;í&para;&Egrave;");               
                f_read(bmpFile,databuff,BmpInfoX.index,(UINT *)&cnt);               
                for(j=cnt;j<LCD_WIDTH*3;j++)   
                {
                    databuff[j]=0x00;
                }
            }   
            else
            {               
                f_read(bmpFile,databuff,LCD_WIDTH*3,(UINT *)&cnt);
                if(LCD_WIDTH*3!=BmpInfoX.index)
                                                                {
                                                                    printf("\r\n&AElig;&Aacute;&Auml;&raquo;&iquest;í&para;&Egrave;&ETH;&iexcl;&Oacute;&Uacute;&Iacute;&frac14;&AElig;&not;&iquest;í&para;&Egrave;");               
                    f_lseek(bmpFile,bitcount+(i+1)*BmpInfoX.index);
                                                                }
            }

                                         for(k=0;k<LCD_WIDTH;k++)       
                                        {               
                                                //        printf("databuff[k]=0x%02x",databuff[j]);
                                                bmpbuff[2]=databuff[k*3];    //B
                                                bmpbuff[1]=databuff[k*3+1];  //G
                                                bmpbuff[0]=databuff[k*3+2];        //R                                       
                                                LCDFastDrawPoint(k,i,bmpbuff);
                                                //printf("  k=%d",k);       
                                        }
                                        //printf("\r\ni=%d",i);
        }  

                f_close(bmpFile);       
                }
        }
                else
                        return PIC_OPEN_ERR;
       
        MemoryFree((uint32_t *)databuff);
        MemoryFree(bmpFile);       
        return 0;
}

void LCDFastDrawPoint(uint16_t x,uint16_t y,uint8_t *data)
{

         SetWindow(x,y,1,1);
         Zebra_SPI_RegWR(0x2C);
         SPI_Prepare();
       

        Zebra_SPI_RGBWR(data[0]);
        Zebra_SPI_RGBWR(data[1]);
        Zebra_SPI_RGBWR(data[2]);               
// SetWindow(0,0,320,240);
}


[/mw_shl_code]
回复

使用道具 举报

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2016-4-23
在线时间
15 小时
 楼主| 发表于 2016-5-21 13:48:33 | 显示全部楼层
抱歉,代码中打印信息用的中文,粘贴上来就显示乱了,原图如下
333.jpg
回复

使用道具 举报

1

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2016-4-20
在线时间
12 小时
发表于 2016-5-21 16:48:24 | 显示全部楼层
感觉是开窗显示那里的问题
回复

使用道具 举报

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2016-4-23
在线时间
15 小时
 楼主| 发表于 2016-5-21 16:50:35 | 显示全部楼层
a458433334 发表于 2016-5-21 16:48
感觉是开窗显示那里的问题

是指setwindow(x,y,1,1)这里吗?
应该不会,我用这个函数测试了画点 划线画圈
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2016-5-21 20:06:08 | 显示全部楼层
仿真跟踪一下,比较容易找问题的
回复

使用道具 举报

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2016-4-23
在线时间
15 小时
 楼主| 发表于 2016-5-22 10:29:58 | 显示全部楼层
正点原子 发表于 2016-5-21 20:06
仿真跟踪一下,比较容易找问题的

不太明白跟踪哪些变量耶。我昨天试着用img2lcd这个小软件将图片转换成数组,同时程序里面也串口打印显示的每个数据。。实在是太多了,不知道怎么做Debug
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2016-5-25 21:53:41 | 显示全部楼层
神奇的蛋蛋 发表于 2016-5-22 10:29
不太明白跟踪哪些变量耶。我昨天试着用img2lcd这个小软件将图片转换成数组,同时程序里面也串口打印显示 ...

慢慢来
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

18

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
261
金钱
261
注册时间
2016-2-18
在线时间
49 小时
发表于 2016-5-27 13:39:38 | 显示全部楼层

我也遇到同样的问题,找到了原因但是不会解决,f_read 这个函数如果在读BMP图片得时候,一次读的数据不要超过521个字节,我用winhex和compare比较软件发现,如果一次fread超过521那么读出的数据和源文件就会不同。  而且stm32的内存也不允许一次存放一张图片,所以分了4次读取。
回复

使用道具 举报

4

主题

49

帖子

0

精华

高级会员

Rank: 4

积分
622
金钱
622
注册时间
2016-5-11
在线时间
40 小时
发表于 2016-5-27 14:08:18 | 显示全部楼层
没做过,但是顶一下...
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 09:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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