将文件以指定格式存储~BMP~C的实现~FAT32格式

参考:

BMP文件学习笔记(一): C/C++语言实现.bmp文件读写_c++ 写入bmp-CSDN博客

U盘到底用什么格式好?FAT32、NTFS还是exFAT? - 知乎 (zhihu.com)

第一部分:

位图文件头

BITMAPFILEHEADER,是一个结构。这个结构的长度是固定的,为14个字节

        (WORD为无符号16位整数,DWORD为无符号32位整数)。

其定义如下:

typedef struct tagBITMAPFILEHEADER {
WORD           bfType;
//位图文件类型,必须是0x4D42,即字符串“BM”,也就是说所有.bmp文件的头两个字节都是“BM”
DWORD          bfSize;//位图文件大小,包括这14个字节
WORD           bfReserved1;//保留字,设为0
WORD           bfReserved2;//保留字,设为0
DWORD        bfOffBits;//从文件头到实际的位图数据的偏移字节数,单位:字节
} BITMAPFILEHEADER;WORD           bfType;//4D42 = BM
DWORD          bfSize;//1920x1080x3+16=5E EC 36
WORD           bfReserved1;//保留字,设为0
WORD           bfReserved2;//保留字,设为0
DWORD          bfOffBits;  //从文件头到实际的位图数据的偏移字节数,单位:字节//Head_Length = 54 byte = 36 hex 

第二部分:

位图信息头

BITMAPINFOHEADER,

是一个结构。这个结构的长度也是固定的,为40个字节(LONG为32位整数)。

其定义如下:

typedef struct tagBITMAPINFOHEADER{
DWORD        biSize;//本结构所占用字节数,大小为40字节
LONG         biWidth;//位图宽度,单位:字节
LONG         biHeight;//位图高度,单位:字节
WORD         biPlanes;//目标设备级别,必须为1
WORD         biBitCount;
//表示颜色时每个像素要用到的位数,常用的值为1(黑白二色图), 4(16色图), 8(256色), 24(真彩色图)
DWORD        biCompression;
// 位图是否压缩,其类型是 0(BI_RGB不压缩),  1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)
DWORD        biSizeImage;//实际的位图数据占用的字节数
LONG         biXPelsPerMeter;//位图水平分辨率,每米像素数
LONG         biYPelsPerMeter;//位图垂直分辨率,每米像素数
DWORD        biClrUsed;
//指定本图象实际用到的颜色数,如果该值为零,则用到的颜色数为2的biBitCount次幂个
DWORD        biClrImportant;//指定本图象中重要的颜色数,如果该值为零,则认为所有的颜色都是重要的
} BITMAPINFOHEADER;

FatFs - Generic FAT Filesystem Module (elm-chan.org)

 f_mount

FRESULT f_mount (FATFS*       fs,    /* [IN] Filesystem object */const TCHAR* path,  /* [IN] Logical drive number */BYTE         opt    /* [IN] Initialization option */
);

参数

fs:文件系统的对象指针

Pointer to the filesystem object to be registered and cleared. Null pointer unregisters the registered filesystem object.

指向要注册和清除的文件系统对象的指针。空指针取消注册已注册的文件系统对象。

path:逻辑分区的标号,一般是0

Pointer to the null-terminated string that specifies the logical drive. The string without drive number means the default drive.

指向指定逻辑驱动器的以 null 结尾的字符串的指针。不带驱动器号的字符串表示默认驱动器。

opt

Mounting option.

0: Do not mount now (to be mounted on the first access to the volume),

1: Force mounted the volume to check if it is ready to work.

0:现在不安装(将在第一次访问卷时挂载),

1:强制挂载以检查它是否准备好工作。

f_open 

FRESULT f_open (FIL* fp,           /* [OUT] Pointer to the file object structure */const TCHAR* path, /* [IN] File name */BYTE mode          /* [IN] Mode flags */
);

fp

Pointer to the blank file object structure.

指向空白文件对象结构的指针。

path

Pointer to the null-terminated string that specifies the file name to open or create.

指向以 null 结尾的字符串的指针,该字符串指定要打开或创建的文件名。

mode

Mode flags that specifies the type of access and open method for the file. It is specified by a combination of following flags.

指定文件的访问类型和打开方法的模式标志。它由以下标志的组合指定。

FlagsMeaning
FA_READSpecifies read access to the file. Data can be read from the file.
FA_WRITESpecifies write access to the file. Data can be written to the file. Combine with FA_READ for read-write access.
FA_OPEN_EXISTINGOpens a file. The function fails if the file is not existing. (Default)
FA_CREATE_NEWCreates a new file. The function fails with FR_EXIST if the file is existing.
FA_CREATE_ALWAYSCreates a new file. If the file is existing, it will be truncated and overwritten.
FA_OPEN_ALWAYSOpens the file if it is existing. If not, a new file will be created.
FA_OPEN_APPENDSame as FA_OPEN_ALWAYS except the read/write pointer is set end of the file.
POSIXFatFs
"r"FA_READ
"r+"FA_READ | FA_WRITE
"w"FA_CREATE_ALWAYS | FA_WRITE
"w+"FA_CREATE_ALWAYS | FA_WRITE | FA_READ
"a"FA_OPEN_APPEND | FA_WRITE
"a+"FA_OPEN_APPEND | FA_WRITE | FA_READ
"wx"FA_CREATE_NEW | FA_WRITE
"w+x"FA_CREATE_NEW | FA_WRITE | FA_READ

f_lseek:移动指针

FRESULT f_lseek (FIL*    fp,  /* [IN] File object */FSIZE_t ofs  /* [IN] Offset of file read/write pointer to be set */
);

fp

Pointer to the open file object.

指向打开的文件对象的指针。

ofs

Byte offset from top of the file to set read/write pointer. The data type FSIZE_t is an alias of either DWORD(32-bit) or QWORD(64-bit) depends on the configuration option FF_FS_EXFAT.

ofs 从文件顶部开始的字节偏移量,用于设置读/写指针。

数据类型 FSIZE_t 是 DWORD(32 位)或 QWORD(64 位)的别名,

具体取决于配置选项 FF_FS_EXFAT。

/* Open file */fp = malloc(sizeof (FIL));res = f_open(fp, "file.dat", FA_READ|FA_WRITE);if (res) .../* Set read/write pointer to 5000 */res = f_lseek(fp, 5000);/* Set read/write pointer to end of the file to append data */res = f_lseek(fp, f_size(fp));/* Advance read/write pointer 3000 bytes */res = f_lseek(fp, f_tell(fp) + 3000);/* Rewind read/write pointer 2000 bytes (take care on wraparound) */res = f_lseek(fp, f_tell(fp) - 2000);

f_write

FRESULT f_write (FIL* fp,          /* [IN] Pointer to the file object structure */const void* buff, /* [IN] Pointer to the data to be written */UINT btw,         /* [IN] Number of bytes to write */UINT* bw          /* [OUT] Pointer to the variable to return number of bytes written */
);

fp

Pointer to the open file object structure.

指向打开文件对象结构的指针。

buff

Pointer to the data to be written.

指向要写入的数据的指针。

btw:希望写入的字节数量

Specifies number of bytes to write in range of UINT type. If the data needs to be written fast, it should be written in large chunk as possible.

指定在 UINT 类型范围内写入的字节数。如果需要快速写入数据,则应尽可能以大块的形式写入。

bw:指向变量的指针,返回写入的字节数

Pointer to the UINT variable that receives the number of bytes written. This value is always valid after the function call regardless of the function return code. If the return value is equal to btw, the function return code should be FR_OK.

指向接收写入字节数的 UINT 变量的指针。无论函数返回码如何,该值在函数调用后始终有效。如果返回值等于btw,则函数返回码应为FR_OK。

f_sync

f_sync 函数刷新写入文件的缓存信息。

FRESULT f_sync (FIL* fp     /* [IN] File object */
);

f_close

FRESULT f_close (FIL* fp     /* [IN] Pointer to the file object */
);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/645677.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣1027. 最长等差数列

动态规划 思路: 可以参考力扣1218. 最长定差子序列目前不清楚公差,可以将序列最大最小值找到,公差的范围是 [-(max - min), (max - min)],按公差递增迭代遍历求出最长等差数列; class Solution { public:int longest…

Mybatis-SqlSessionFactory/多数据源

下面的代码演示了发送一个HTTP请求到Controller,如果key“dev”,则查询dev数据库,否则查询默认的数据库 Resourceprivate SqlSessionFactory sqlSessionFactory;Resourceprivate DataSource defaultDataSource;Resourceprivate XXXMapper xxx…

go语言下划线、变量和常量

1、下划线 “_”是特殊标识符,用来忽略结果。 1.1. 下划线在import中 在Golang里,import的作用是导入其他package。import 下划线(如:import hello/imp)的作用:当导入一个包时,该包下的文件里…

IDEA 创建maven项目没有src

环境: IntelliJ IDEA 2022.3.3 (Ultimate Edition) JDK 17 Windows 11 10.0 Maven 3.9.5 创建maven项目的时候没有src目录 试过网上说的重新配置maven库,增加vm-options,并没有什么用。直到我看见了 正常创建就好了。

[计算机提升] 清理系统盘的前期准备

5.1 清理系统盘的前期准备 5.1.1 系统盘之殇:为什么系统盘会越来越大 在windows系统中,系统盘一般是C盘,随着电脑使用时间变长,系统盘会变得越来越大。而系统盘通常在安装系统时已经固定好了,如果系统盘的剩余空间太…

【前端基础--1】

为后面爬虫打基础 使用Visual Studio Code(VS Code) https://code.visualstudio.com/#alt-downloads 网页基础 创建一个html网页 新建一个文件 文件名后缀.html 书写网页模板 html:5 回车键(或者Tab键)英文感叹号! 回…

接收邮件触发器

无代码自动化-接收邮件触发器-做的最好的是make.com。数环通和集简云在这方面差了很多,我考虑主要原因应该是国内没有用邮件的习惯,都是微信来微信去。 2024年1月25日的观察结果 集简云 有邮件触发器,但是它获取的邮件信息很少。 我最关心…

深入解析MySQL数据库锁机制

目录 引言 一、锁的基本概念 1. 共享锁和排它锁 2. 行锁和表锁 二、MySQL锁的类型 1. 共享锁(Shared Lock) 2. 排它锁(Exclusive Lock) 3. 意向共享锁(Intention Shared Lock) 4. 意向排它锁&…

【动态规划】【map】【C++算法】1289. 下降路径最小和 II

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 map LeetCode1289. 下降路径最小和 II 给你一个 n x n 整数矩阵 grid ,请你返回 非零偏移下降路径 数字和的最小值。 非零偏移下降路径 定义为:从 grid 数组中的每一行选择一个数字,…

Qt防止创建窗口抢焦点

问题是,当我在 Qt 中打开一个新窗口时,它会自动窃取前一个应用程序的焦点。 有什么办法可以防止这种情况发生吗? setAttribute(Qt::WA_ShowWithoutActivating);这会强制窗口不激活。即使有Qt::WindowStaysOnTopHint flag 出处: S…

什么是超融合?

文章标题 前言一、超融合是什么?二、超融合原理2.1、超融合三大组件2.2、超融合和传统架构对比2.3、传统方案和超融合软件架构与资源管理模式对比 三、 超融合与SDS、分布式存储关系3.1、SDS是什么 ?3.2、分布式存储是什么?3.3、超融合是什么…

<网络安全>《6 脆弱性扫描与管理系统》

1 概念 脆弱性扫描与管理系统本质上就是系统漏洞扫描,简称漏扫。 根据漏洞规则库(本地漏洞库、ActiveX库、网页木马库、网站代码审计规则库等)为基础,采用深度主机服务探测、Web智能化爬虫、SQL注入状态检测、主机配置检查以及弱…

开始学习Vue(路由)

一、什么是路由 SPA 指的是一个 web 网站只有唯一的一个 HTML 页面,所有组 件的展示与切换都在这唯一的一个页面内完成。 此时,不同组件之间的切换需要通过前端路由来实现。 结论:在 SPA 项目中,不同功能之间的切换&#xff0…

vue el-date-picker 开始日期不能大于结束日期

HTML <el-form-item label"开始日期" prop"startTime"><el-date-picker clearable v-model"form.startTime" type"date" value-format"yyyy-MM-dd" :picker-options"pickerOptionsStartq" placeholder&q…

CAN总线接头(接线端子)都有哪些种类。

CAN总线是广泛应用在汽车控制和工业自动化控制领域里的现场总线&#xff0c;具有广阔的发展前景。基于CAN总线&#xff0c;工程师们开发出了各种各样的相关设备&#xff0c;比如USBCAN分析仪以及CAN转换网关等等。不知道你是否注意过&#xff0c;这些CAN总线设备的CAN接口都是什…

CUBEMX与FreeRTOS在Arm Compiler 6下的配置方法

在嵌入式开发中&#xff0c;STM32是一种广泛使用的微控制器。为了提高开发效率&#xff0c;我们通常会利用ST公司提供的STM32CubeMX工具来配置硬件&#xff0c;并结合FreeRTOS这一实时操作系统来进行多任务处理。本文将深入探讨如何在这一框架下&#xff0c;使用Arm Compiler 6…

结合Tensuns管理prometheus的blackbox与告警设置

场景说明&#xff1a; 因为业务服务器已经完成了三级等保&#xff0c;禁止在业务服务器上部署任何应用&#xff0c;遂选择一台新的服务器部署prometheus&#xff0c;采用blackbox_exporter监控业务服务器的端口与域名状态。 Tensuns项目介绍 https://github.com/starsliao/T…

链表--24. 两两交换链表中的节点/medium 理解度C

24. 两两交换链表中的节点 1、题目2、题目分析3、复杂度最优解代码示例4、适用场景 1、题目 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&…

forEach()方法跳出循环

forEach方法如何跳出循环_foreach跳出循环-CSDN博客 forEach方法遍历数组&#xff0c;每次遍历都根据条件判断&#xff0c;当条件符合时&#xff0c;就跳出整个遍历&#xff0c;不再继续遍历后面的元素 forEach()方法跳出整个循环遍历 forEach方法一般用抛出异常的方式跳出整…

Python学习之路-Flask项目:博客前台

Python学习之路-Flask项目:博客前台 前言 前一篇完成了项目开发前的所有准备工作&#xff0c;本篇将完成整个博客的前台相关工作。 首页 前言 首页主要为我们提供各个分类入口已经按时间顺序的文章列表和列表排行等数据&#xff0c;是进入博客中第一眼看到的&#xff0c;接…