野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12925|回复: 1

外部FLASH存储SD卡内bmp图片

[复制链接]
发表于 2016-3-15 14:23:41 | 显示全部楼层 |阅读模式
我将SD卡上的bmp格式图片保存到外部FLASH上,下面这段程序火哥帮忙看看有什么问题,我红色标出的地方读出的数据开头两字节也不是0x4d42啊,高手们帮我看看我要怎么改才能正确的把数据存到外部FLASH 中,后面再从flash中读出数据在LCD上显示这个bmp图片




int Save_Picture_To_Flash(u32 WriteAddr, uint8_t * pic_name)
{
       int i, j, k;
        int width, height, l_width;

        BYTE red,green,blue;
        BITMAPFILEHEADER bitHead;
        BITMAPINFOHEADER bitInfoHead;
        WORD fileType;
        
        unsigned int read_num;
        unsigned char tmp_name[20];
        sprintf((char*)tmp_name,"0:%s",pic_name);
        
       //擦除FLASH  24k大小,从4096*64               
        for(i=0;i<6;i++){
                SPI_FLASH_SectorErase(WriteAddr+4096*i);        
        }
        printf("\r\n FLASH擦除成功! \r\n");
        
/************************************************************************/
        f_mount(0, &bmpfs[0]);  
        bmpres = f_open( &bmpfsrc , (char *)tmp_name, FA_OPEN_EXISTING | FA_READ);        

        if(bmpres == FR_OK)
        {
                // 读头文件信息 2字节      
                f_read(&bmpfsrc,&fileType,sizeof(WORD),&read_num);     

                // 判断是不是BMP文件
                if(fileType != 0x4d42)
                {
                        BMP_DEBUG_PRINTF("file is not .bmp file!\r\n");
                        return 1;
                }
                else
                {
                        BMP_DEBUG_PRINTF("Ok this is .bmp file\r\n");        
                }        

                // 读bmp头文件信息
                f_read(&bmpfsrc,&bitHead,sizeof(tagBITMAPFILEHEADER),&read_num);        
                showBmpHead(&bitHead);

                // 读位图头文件信息
                f_read(&bmpfsrc,&bitInfoHead,sizeof(BITMAPINFOHEADER),&read_num);        
                showBmpInforHead(&bitInfoHead);
        }   
        else
        {
                BMP_DEBUG_PRINTF("file open fail!\r\n");
                return 1;
        }
/******************************************************************************/

        
        width = bitInfoHead.biWidth;
        height = bitInfoHead.biHeight;

        // 计算位图的实际宽度      
        l_width = WIDTHBYTES(width* bitInfoHead.biBitCount);        

        if(l_width > 960)
        {
                BMP_DEBUG_PRINTF("\n SORRY, PIC IS TOO BIG (<=320)\n");
                return 1;
        }
/******************************************************************************/      
        if( bitInfoHead.biBitCount >= 24 )
        {
                for ( i = 0; i < height; i ++ )
                {
      f_lseek ( & bmpfsrc, bitHead .bfOffBits + ( height - i - 1 ) * l_width );        
                        
                        // 读取一行bmp数据到数组pColorData
                       
bmpres=f_read ( & bmpfsrc, pColorData, l_width, & read_num );
                        printf("\r\n bmpres=%d \r\n",bmpres);
                        
                        if(bmpres==FR_OK){                                                        //将读出的数据写FLASH中,写入地址4096*64
                                SPI_FLASH_BufferWrite(pColorData, WriteAddr+i*l_width, l_width);
                        }else{
                                return 1;
                        }        
                }        
                return 0;
        }   
        
        else
        {        
                BMP_DEBUG_PRINTF("SORRY, THIS PIC IS NOT A 24BITS REAL COLOR");
                return 1;
        }
        
/***************************************************************************************/        
        f_close(&bmpfsrc);
}
回复

使用道具 举报

发表于 2016-3-15 15:35:02 | 显示全部楼层
帮顶,解决了告诉下我
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-9-23 11:25 , Processed in 0.033724 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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