初级会员

- 积分
- 176
- 金钱
- 176
- 注册时间
- 2014-11-20
- 在线时间
- 36 小时
|

楼主 |
发表于 2021-12-20 09:31:20
|
显示全部楼层
网络上爬了很多,没有做记录。最终是自己搞了个算法解决的。核心代码如下
int w,h,len;
u32 rc;
int i,j,k=0;
int num,total;
unsigned char c;
f_lseek(f_bmp,18);
f_read(f_bmp,&w,4, &rc); //取4字节,bmp文件头中图像的宽度
len=((31+w)/32)*4; //8字节对齐,因为是1位图,1个字节代表8个像素点
f_lseek(f_bmp,22);
f_read(f_bmp,&h,4,&rc); //取4字节,bmp文件头中图像的高度
f_lseek(f_bmp,26); //文件指针移动26字节,到数据位
total = f_size(f_bmp);
if(total <=0)
goto _exit;
for(i=0;i<h;i++)
{
num = total - (len*(i+1)); //因为是小端,低地址存高位,高地址存地位。根据扫描方式不同,数据从文件尾部往前取。
f_lseek(f_bmp, num);
for(j=0; j<w; j+=8) //每次移动8位,是1个字节代表8个像素。宽度、高度、都是指像素,因此这里每次移动8的倍数
{
f_read(f_bmp, &c, 1, &rc);
img[k++] = c;
}
}
_exit:
total = 0; |
|