OpenEdv-开源电子网

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

bmp如何转换成点阵集?

[复制链接]

4

主题

10

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2018-1-3
在线时间
6 小时
发表于 2018-1-5 19:46:56 | 显示全部楼层 |阅读模式
2金钱
一个二值化后的240*320的bmp文件转换成点阵集,应该怎么写?我写的程序如下,不能运行!!!!!!




u8 read[76800];
                                int num=0;
                                FIL* f_bmp;
                                u16 br;
                                u16 count;                                
               
                                  
                                u8 res;
                                u8 x1,y1;
                                u8 *databuf;                   
                                u16 readlen=BMP_DBUF_SIZE;

                                u8 *bmpbuf;                          

                                u16 rowlen;                           
                                BITMAPINFO *pbmp;               
       
#if BMP_USE_MALLOC == 1               
        databuf=(u8*)pic_memalloc(readlen);               
        if(databuf==NULL)return PIC_MEM_ERR;       
        f_bmp=(FIL *)pic_memalloc(sizeof(FIL));       
        if(f_bmp==NULL)                                                       
        {                 
                pic_memfree(databuf);
                return PIC_MEM_ERR;                               
        }          
#else                                        
        databuf=bmpreadbuf;
        f_bmp=&f_bfile;
#endif
        res=f_open(f_bmp,(const TCHAR*)pname,FA_READ);                                                           
        if(res==0)
        {
                f_read(f_bmp,databuf,readlen,(UINT*)&br);       
                pbmp=(BITMAPINFO*)databuf;                                  
                count=pbmp->bmfHeader.bfOffBits;   
                ai_draw_init();               
               
                bmpbuf=databuf;
                }
for(y1=0;y1<320;y1++)
                for(x1=0;x1<240;x1++)
                {
                if(bmpbuf[count++]==00)
                {
                        read[num++].x=x1;
                 read[num++].y=y1;
                }
                }


最佳答案

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

typedef struct { char cfType[2]; /* 文件类型, 必须为 "BM" (0x4D42)*/ char cfSize[4]; /* 文件的大小(字节) */ char cfReserved[4]; /* 保留, 必须为 0 */ char cfoffBits[4]; /* 位图阵列相对于文件头的偏移量(字节)*/ }__attribute__((packed)) BITMAPFILEHEADER; /* 位图信息头结构40byte */ typedef struct { char ciSize[4]; /* size of BITMAPINFOHEADER */ ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

156

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1553
金钱
1553
注册时间
2016-11-21
在线时间
411 小时
发表于 2018-1-5 19:46:57 | 显示全部楼层
typedef struct
{
        char cfType[2];         /* 文件类型, 必须为 "BM" (0x4D42)*/
        char cfSize[4];         /* 文件的大小(字节) */
        char cfReserved[4];     /* 保留, 必须为 0 */
        char cfoffBits[4];      /* 位图阵列相对于文件头的偏移量(字节)*/
}__attribute__((packed)) BITMAPFILEHEADER;      

/* 位图信息头结构40byte */
typedef struct
{
        char ciSize[4];         /* size of BITMAPINFOHEADER */
        char ciWidth[4];        /* 位图宽度(像素) */
        char ciHeight[4];       /* 位图高度(像素) */
        char ciPlanes[2];       /* 目标设备的位平面数, 必须置为1 */
        char ciBitCount[2];     /* 每个像素的位数, 1,4,8或24 */
        char ciCompress[4];     /* 位图阵列的压缩方法,0=不压缩 */
        char ciSizeImage[4];    /* 图像大小(字节) */
        char ciXPelsPerMeter[4];/* 目标设备水平每米像素个数 */
        char ciYPelsPerMeter[4];/* 目标设备垂直每米像素个数 */
        char ciClrUsed[4];      /* 位图实际使用的颜色表的颜色数 */
        char ciClrImportant[4]; /* 重要颜色索引的个数 */
}__attribute__((packed)) BITMAPINFOHEADER;      


typedef struct PIXINFO
{
        u8 r;
        u8 g;
        u8 b;
}PIX;
BITMAPFILEHEADER FileHead;
BITMAPINFOHEADER InfoHead;
FIL myfp;

FIL myfp;
signed char Get_Icon(char *bmpfile ,u32 addr)
{
        PIX pix;
        int ciBitCount,ciWidth,ciHeight;
        u8 lcdcolor[4];
        u16 dispcolor=0;
        u8 buf[256];
        u16 bnum=0;
        u16 i=0,j=0;
        u32 offset=0;
        /* (1)打开位图文件 */
        myres=f_open(&myfp,bmpfile,FA_OPEN_EXISTING|FA_READ);   //以二进制的只读方式打开文件
        if (myres != FR_OK)
        {
                return -1;
        }
        /*(2) 读取位图文件头 */
        myres=f_read(&myfp,&FileHead,sizeof(BITMAPFILEHEADER),&mybw);
        if ( myres != FR_OK)
        {
                f_close(&myfp);
                return -2;
        }

        /*(3) 判断位图的类型 */
        if (memcmp(FileHead.cfType, "BM", 2) != 0)  //内存对比
        {
                f_close(&myfp);
                return -3;
        }

        /* (4)读取位图信息头 */
        myres=f_read(&myfp,(char *)&InfoHead,sizeof(BITMAPINFOHEADER),&mybw);
        if ( myres != FR_OK)
        {
                f_close(&myfp);
                return -4;
        }
       
        ciBitCount = (int) chartolong( InfoHead.ciBitCount, 4 );//获得图片色深
        ciWidth                 = (int) chartolong( InfoHead.ciWidth , 4 );
        ciHeight         = (int) chartolong( InfoHead.ciHeight, 4 );
        /*(5)将文件光标移动到文件的数据区 */

       
        for(bnum=0;bnum<(ciWidth*ciHeight*2+4095)/4096;bnum++)
        {
                W25QXX_EraseSector(addr+bnum*4096);
        }
        bnum=0;
       
        offset=(int)chartolong(FileHead.cfoffBits,4);
        for(j=0;j<ciHeight;j++)
        {       
                f_lseek(&myfp,offset+(ciHeight-j-1)*ciWidth*ciBitCount/8);
                for(i=0;i<ciWidth;i++)
                {
                        myres=f_read(&myfp,(char *)&lcdcolor,ciBitCount/8,&mybw);
                        if(ciBitCount==32||ciBitCount==24)
                        {
                                pix.r=lcdcolor[2]>>3;
                                pix.g=lcdcolor[1]>>2;                               
                                pix.b=lcdcolor[0]>>3;
                        }
                        else if(ciBitCount==16)
                        {
                                dispcolor=(lcdcolor[0]<<0)|(lcdcolor[1]<<8);                //1111 1111 1111 1111
                                if((int)chartolong(InfoHead.ciCompress,4)==0)                //RGB555
                                {
                                        pix.r=((dispcolor&0x7C00)>>10);
                                        pix.g=(((dispcolor&0x03E0)<<1)>>5);                                // RGB555 扩展成RGB565   G=G*64/32
                                        pix.b=(dispcolor&0x1F);
                                }
                                else                //RGB565
                                {
                                        pix.r=((dispcolor&0xF800)>>11);
                                        pix.g=(((dispcolor&0x07E0))>>5);                                // RGB555 扩展成RGB565   G=G*64/32
                                        pix.b=(dispcolor&0x1F);                               
                                }
                        }               
                        dispcolor=((pix.r)<<11)|((pix.g)<<5)|(pix.b);
//                        GUI_DrawPixel(i,j,dispcolor);
                        buf[bnum++]=(u8)(dispcolor>>8);
                        buf[bnum++]=(u8)(dispcolor&0xFF);
                       
                        if(bnum==256)
                        {
                                W25QXX_WritePage(buf,addr,256);
                                addr+=256;
                                bnum=0;
                        }
                }
        }               
        W25QXX_WritePage(buf,addr,bnum);
        addr+=bnum;
       
        f_close(&myfp);
        return( 0 );
}


参考这个程序咯
回复

使用道具 举报

4

主题

10

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2018-1-3
在线时间
6 小时
 楼主| 发表于 2018-1-9 10:03:07 | 显示全部楼层
msq001 发表于 2018-1-5 19:59
typedef struct
{
        char cfType[2];         /* 文件类型, 必须为 "BM" (0x4D42)*/

老铁,你那个chartolong函数,入口参数4是表达什么呀
回复

使用道具 举报

8

主题

156

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1553
金钱
1553
注册时间
2016-11-21
在线时间
411 小时
发表于 2018-1-9 16:42:16 | 显示全部楼层
zhang1997115 发表于 2018-1-9 10:03
老铁,你那个chartolong函数,入口参数4是表达什么呀

/************************************************************************
把存放在内存中的字符拼接为一个长整形数据返回。
实际是我们的数字在内存中存放以字节形式存放的,
如0x12345678,其实是0x78,0x56,0x34,0x12这样存放
************************************************************************/
long chartolong( char * string, int length )
{
        long number;

        if (length <= 4)
        {
                memset( &number, 0x00, sizeof(long) );  //清空
                memcpy( &number, string, length );      //填充
        }

        return number;
}
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-16 23:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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