嵌入式Linux--读取bmp文件头信息

Linux应用开发-LCD显示BMP图片 为了解BMP格式,这篇文章就采用Linux开发板作为实验平台,在LCD屏上读取BMP图片,完成绘制,不需要借助任何第三方库,全部由纯C语言代码一行一行敲出来,深入理解Linux下帧缓冲编程框架、BMP图片的存储结构原理。 阅读详情

文件头信息的格式定义可以参考这里,读取文件信息有两种方式,第一种方式是定义一个字符串,使用read函数将图像信息读取到字符串中,然后自己去提取想要的数据。这种方法需要我们提前知道图像文件头的格式定义,很麻烦且容易出错,适合初学阶段使用,熟悉了之后即可过渡使用第二种方式;第二种方式是使用bmp结构体,结构体可以自行定义,也可以去网上找,百度一大堆。定义结构体变量存储文件头信息这种方式的优点是格式清晰,代码可读性好。
我找的结构体如下,原文链接在这。

//文件头结构体
typedef struct 
{ 
	unsigned char    bfType[2];		//文件类型
	unsigned long    bfSize;		//位图大小
	unsigned short bfReserved1;		//位0 
	unsigned short bfReserved2;		//位0
	unsigned long    bfOffBits;		//到数据偏移量
} BitMapFileHeader;

函数如下:

/*
 *函数功能:解析bmp图片
 *参数列表:path:要解析的图片的pathname
 *返回值 :错误时返回-1,解析正确返回0
 */
int bmp_analyze(unsigned char *path)
{
	int fd = -1;
	BitMapFileHeader fHeader;
		
	//打开bmp图片
	fd = open(path, O_RDONLY);
	if (fd < 0) {
		fprintf(stderr, "open %s error.\n", path);
		return -1;
	}
		
	//读取文件头信息
	read(fd, &fHeader, sizeof(fHeader));
	printf("bfSize:%ld\n", fHeader.bfSize);
	printf("bfOffBits:%ld\n", fHeader.bfOffBits);
	
	//关闭打开的文件
	close(fd);
	
	return 0;
}

执行结果如下:

显示bfSize(文件大小)为28,这显然是不对的。根据WinHex查看图片可以看到,实际数据为0x36 0x20 0x1C 0x00,而在BMP文件中数据存储方式为小端模式(低地址存放低字节),因此实际bfSize为1843254(0x1C2036)个字节。

下面开始查找问题。
将读取到的信息都打印出来,分析原始数据。

int bmp_analyze(unsigned char *path)
{
	int fd = -1, i;
	BitMapFileHeader fHeader;
	
	//打开bmp图片
	fd = open(path, O_RDONLY);
	if (fd < 0) {
		fprintf(stderr, "open %s error.\n", path);
		return -1;
	}
	
	//读取文件头信息
	read(fd, &fHeader, sizeof(fHeader));
	printf("bfSize:%ld\n", fHeader.bfSize);
	printf("bfOffBits:%ld\n", fHeader.bfOffBits);
	
	//将读取到的信息打印出来
	for (i = 0; i < sizeof(fHeader); i++) {
		printf("%x ", *((unsigned char *)&fHeader + i));
	}
	printf("\n");

	//关闭打开的文件
	close(fd);

	return 0;
}

这时就可以看到读取的结果,数据大小为16字节!而结构体中的数据大小为14字节!这就牵扯到字节对齐问题了,其实好早以前就知道这个概念,单纯的以为就是以牺牲空间为代价去提高处理器存取效率,没想到会对上层有影响!把结构体变量当成字符串去存储数据的方法也是我第一次使用,然后就遇到了这个问题。
这里扯一下字节对齐,以前也看了好多资料,总结一下就四点:

  • 结构体变量的首地址是其最宽基本类型成员大小的整数倍;
  • 结构体成员首地址的偏移量(相对于结构体首地址) 是成员大小的整数倍;
  • 结构体的总大小为结构体最宽基本类型成员大小的整数倍;
  • 如有需要编译器会在成员之间加上填充字节;

解决办法:取消字节对齐。
取消字节对齐的两种方法:

  • 在定义结构体之前使用伪指令#pragma pack ()
  • 在结构体名称之前加__attribute__((packed))

结构体定义于是被修改为了:

typedef struct 
{ 
	unsigned char    bfType[2];		//文件类型
	unsigned long    bfSize;		//位图大小
	unsigned short bfReserved1;		//位0 
	unsigned short bfReserved2;		//位0
	unsigned long    bfOffBits;		//到数据偏移量
} __attribute__((packed)) BitMapFileHeader;	

原链接本来默认就取消了字节对齐,但是一开始并不了解具体深意,于是就被我删掉了,看来还是得加上。
调试结果如下图:

到这里就显示正常了,1843254就是0x1C2036,还有一个问题是伪指令#pragma pack ()没效果,不知道是gcc的问题还是什么其他的问题。

大唐杯历届省赛押题训练(6) 考试-TD-LTE无线网络设备介绍-TD-LTE网络架构一、单选题1TD-LTE的接入网E-UTRAN由下列哪些网元组成( )。0分/1分A、RNCB、BTSC、eNode BD、Node B提交答案:B正确答案:C考点TD-LTE网络架构解析暂无试题解析二、多选题1关于LTE网络整体结构,哪些说法是正确的( )0分/2分A、E-UTRAN用E-NodeB替代原有的RNC-NodeB结构B、E-NodeB间的接口为S1接口C、各网络节点之间的接口使用IP传输。 阅读详情

相关推荐

手把手教你用Python模拟侧信道攻击:从电磁辐射到数据窃取(附防御代码)

本文详细介绍了如何使用Python模拟侧信道攻击,从电磁辐射信号采集到数据窃取的全过程,并提供了实用的防御代码。通过实战案例,帮助安全研究员和开发者理解侧信道攻击原理,掌握信号处理与图像重建技术,同时学习有效的噪声干扰和电磁屏蔽防御措施。

weixin_28716443的博客 162

BMP格式详解

BMP(全称Bitmap)是Windows操作系统中的标准图像文件格式,可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),使用非常广。它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。BMP文件的图像深度可选lbit、4bit、8bit及24bit。BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。由于BMP文件格式是Wi

Valineliu 7万+

统信UOS/麒麟Kylin OS下利用pyenv实现Python多版本开发环境搭建指南

本文详细介绍了在统信UOS和麒麟Kylin OS国产操作系统下使用pyenv搭建Python多版本开发环境的完整指南。从系统环境准备、pyenv定制安装到Python版本编译实战,提供了针对国产CPU架构的特殊优化方案和常见问题解决方法,帮助开发者高效管理不同Python版本需求。

sea99的博客 1052

BMP图片-文件头部信息

BMP 图片也就是位图(bitmap),直接存储像素数据,几乎不进行压缩,图像信息丰富,比较明显的缺点就是占用空间大。 BMP 图片的结构很简单,首先是文件信息、接着是位图信息,然后是调色板信息,最后是位图数据。需要注意的是,文件头部信息的每一部分都是固定大小的,所以在处理文件头部信息时需要按 1 字节对齐的方式访问,或者在声明结构体时用关键字 “__attribute__((packed))” 取消字节对齐。 1. 文件信息 文件信息结构体: typedef struct tag_bitmap_file_

lk_luck的博客 6921

【量化入门】Tushare库获取公募基金的历史净值

在本文中,我们将介绍如何使用Python的Tushare库获取公募基金的历史净值。

木头大左的博客 1144

图解联合概率密度、边缘概率密度、条件概率密度之间的关系

简要图解联合概率密度、边缘概率密度、条件概率密度之间的关系

一个搬运知识的笨小孩 2万+

bmp图片的头相关信息

偏移量 域的名称 大小 内容       图象文件头 0000h 文件标识 2 bytes 两字节的内容用来识别位图的类型: ‘BM':Windows3.1x, 95, NT, ... ‘BA':OS/2Bitmap Array ‘CI':OS/2Color Icon ‘CP':

jinkang_zhao的博客 1360

从 SM30 到 Fiori:在 SAP BTP ABAP Environment 里创建 Business Configuration 配置维护对象的完整路径

摘要 在SAP BTP的ABAP环境中,传统SAP GUI和SM30配置方式被Business Configuration (BC)替代。BC通过Fiori应用维护配置,支持传输和权限控制。配置表需满足可维护性条件,如允许数据维护、包含技术字段等。通过ADT生成Maintenance Object和Transport Object,实现配置发布与治理。权限管理需创建IAM App和Business Catalog,确保配置可维护。BC在云端延续了可控、可追溯、可发布的治理原则。 (字数:150)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 242

Bmp图片格式介绍

BMP是英文)的简写,它是中的标准,能够被多种Windows所支持。随着Windows操作系统的流行与丰富的Windows应用程序的开发,BMP位图格式理所当然地被广泛应用。这种格式的特点是包含的图像信息较丰富,几乎不进行压缩,但由此导致了它与生俱来的缺点–占用磁盘空间过大。

南大侠的博客 8757

《从底层结构开始学习FPGA》目录与传送门

《从底层结构开始学习FPGA》目录与传送门

孤独的单刀 16万+

【电源专题】Type-C母座外壳直接接主板GND还是接RC呢?别再纠结了!

Type-C屏蔽壳接地这件事,没有唯一标准答案。符合规范、贴合产品、能过认证,就是最优解。希望这篇文章能帮你理清思路。

一点硬件 601

Linux使用vi或vim查看图片文件二进制数据,通过读取BMP头文件数据获取图片宽高

Linux使用vi或vim查看图片文件二进制数据,通过读取BMP头文件数据获取图片宽高 使用vi或vim查看图片二进制数据 首先放一张没有问题的图片到虚拟机中,图片格式我只测试了jpg和bmp,都可以,然后输入指令: vi -b image.bmp 或 vim -b image.bmp 然后就出现如下界面,也可能你的系统没有装vi或vim而报错 然后输入:%!xxd,回车,就能转换成十六进制了 我也是找了很久方法才见到了自己“梦寐以求”的十六进制数据 通过读取BMP头文件数据获取图片宽高 我们知道BM

qq_16186465的博客 4722

RAGFlow升级指南(纯小白都看得懂)

升级背景:RAGFlow项目原来的版本是0.17.0版本,在使用过程中,发现当知识库检索为空的时候并且使用到rerank模型的时候,就会输出错误的信息;为了解决这个版本问题,特意升级到最新的版本0.17.2(截止2025-3-14时最新版本就是0.17.2了)官方升级文档https://ragflow.io/docs/dev/upgrade_ragflow官方文档对小白还是不太友好,作者也是捣鼓了十多分钟,特出下面的升级指南前提:旧版本的RAGFlow项目是启动好了的1.在ragflow目录下执行(拉取最新

Ven%的博客 3596

BMP图片格式解析及在嵌入式设备上的显示

BMP图片格式解析与显示原理 摘要:BMP是Windows的标准位图格式,采用非压缩方式存储图像数据。其文件结构包含文件头、位图信息头、颜色表(24位BMP通常省略)和像素数据。24位BMP每个像素用3字节表示(BGR顺序),图像数据从下往上存储,每行需4字节对齐。在嵌入式系统中显示BMP的核心步骤包括:解析文件头获取图像尺寸,处理像素数据(BGR转RGB),跳过填充字节,最后写入帧缓冲区(如/dev/fb0)。示例代码展示了如何读取BMP文件信息,并通过内存映射方式在开发板上实现图像显示。

sqym1的博客 1023

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

解码Linux文件IO之BMP 图像原理与应用

BMP(位图)是微软开发的图像文件格式,采用无压缩存储方式,文件较大但解析简单,适合本地开发。其结构由文件头(14字节)、信息头(40字节)、可选调色板和像素数据组成,总头部长54字节。关键特性包括:支持多种色深(1/4/8/24/32bit),24bit最常见;像素数据采用BGR顺序;行数据需4字节对齐;默认从下到上存储图像。BMP与JPEG、PNG等格式相比,优势在于无压缩、解码简单,但文件体积较大,适用于LCD显示等本地场景。开发时需注意小端存储、行对齐和像素格式转换等技术细节。

愿能与同路的你交流互鉴~ 博客园 :https://www.cnblogs.com/YouEmbedded/ 1747

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

linux下实现对framebuffer(/dev/fb0)的截屏操作

在linux系统中,使用framebuffer来提供用户态进程直接操作显示屏的功能. 在嵌入式系统开发中,需要对显示屏的内容进行截取,实现一个lcd截屏工具实现对显示屏内容的截取,存储为bmp格式. 一个bmp文件有四部分组成: 其中位图文件头内容如下: WORDbfType; DWORDbfSize; WORDbfReserved1; WOR...

冰夫子的博客 1051

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

BMP图片解析与LCD显示实战

新增任意位置 / 任意尺寸的适配逻辑,可直接交叉编译在开发板运行,依次关闭文件、解除映射,释放所有资源,避免内存泄漏。

Aichirou3的博客 905

bmp qimage 保存位_Linux下bmp图片转为c语言头文件

bmp图片格式:组成结构:位图文件头+位图信息头+彩色表+定义位图的RGB字节阵列。位图文件头:类别(2字节)+文件大小(4字节)+保留位(4字节)+数据偏移量(4字节)。位图信息头:信息头长度(4字节)+位图宽度(4字节)+位图高度(4字节)+位面数(2字节)+单像素位数(2字节)+压缩(4字节)+位图大小(4字节)+水平分辨率(4字节)+垂直分辨率(4字节)+颜色数(4字节)+重...

weixin_36474829的博客 338

深入解析BMP图片在嵌入式Linux(GEC6818)上的显示原理与‘癞子’字节处理

本文深入探讨了BMP图片在嵌入式Linux(GEC6818)上的显示原理,重点解析了'癞子'字节处理、帧缓冲内存映射机制及不同色深图片的处理差异。通过详细代码示例和原理分析,帮助开发者掌握GEC6818开发板上的图像显示技术,解决实际开发中的常见问题。

weixin_30571465的博客 394

嵌入式第二十五课!!!文件读写操作补充与应用、以及文件流定位相关函数接口

本文介绍了C语言中文件读写操作的相关函数及其应用。主要内容包括:1. fgets/fputs函数用于文本文件读写,对比了gets和fgets的区别;2. fwrite/fread函数用于二进制文件读写,演示了结构体数据的读写方法;3. 文件流定位函数fseek和ftell的使用;4. 实际应用案例:解析BMP文件头信息和模拟迅雷下载的磁盘空间抢占功能。文章详细讲解了各函数的参数、返回值和使用注意事项,并提供了完整的代码示例,帮助理解文件操作的核心概念和实现方法。

2402_84218922的博客 2298

bmp文件头_Linux下bmp图片转为c语言头文件

bmp图片格式:组成结构:位图文件头+位图信息头+彩色表+定义位图的RGB字节阵列。位图文件头:类别(2字节)+文件大小(4字节)+保留位(4字节)+数据偏移量(4字节)。位图信息头:信息头长度(4字节)+位图宽度(4字节)+位图高度(4字节)+位面数(2字节)+单像素位数(2字节)+压缩(4字节)+位图大小(4字节)+水平分辨率(4字节)+垂直分辨率(4字节)+颜色数(4字节)+重...

weixin_39677027的博客 317

bmp文件头_linux开发板上显示BMP文件

1)在windows小端储存在计算机储存单位数据时,如果数据块超过一个字节,低字节存在低地址即内部图像数据RBG储存是BGR...BGR存储的2)开发板开发板中的Linux是阉割版 人机交互只能通过Linux指令 (板内Linux通过接受从串口线发送过来的指令数据 解析 执行 得到结构 再通过串口线将执行结果返回到 CRT中显示,所以CRT相当于6818开发 板的显示屏)3)操...

weixin_39554434的博客 600

嵌入式开发板屏幕显示图片(bmp)

帧缓冲(framebuffer)是Linux为显示设备提供的一个接口,把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。

m0_65890285的博客 2245

嵌入式linux——显示BMP

这篇文章介绍了如何在Linux系统中读取和显示BMP格式图片。主要内容包括: BMP文件格式解析 详细说明了BMP文件结构,包括文件头(BITMAPFILEHEADER)和位图信息头(BITMAPINFOHEADER) 提供了这两个结构体的C语言定义,使用__attribute__((packed))确保内存对齐 读取BMP文件的方法 通过文件IO操作读取BMP头信息 获取图片宽度、高度、颜色深度等关键参数 LCD显示实现 介绍了两种在LCD上显示BMP图片的方法: 直接使用write系统调用 更高效的内存

2203_75869765的博客 176

嵌入式Linux小项目之图片编解码播放器(3)

目录一、BMP图片的显示1、图片文件的本质2、BMP图片详解3、BMP文件头信息4、图片有效数据区5、写代码解析BMP图片6、BMP图片的显示7、用结构体方式解析BMP文件头8、解析信息头二、编程实践 一、BMP图片的显示 1、图片文件的本质 (1)二进制文件(文件分2种:2进制文件和文本文件) (2)不同格式的图片文件的差别 (3)BMP图片的基本特征:未被压缩的元素位图格式 2、BMP图片详解 (1)BMP文件如何识别:每种图片格式都有定义好的一种识别方法,BMP图片特征是以0x424D开头 (2)BM

小嵌同学的博客 1052

Linux LCD与BMP图像处理实战指南

优先使用mmap内存映射操作 LCD,减少数据拷贝,提高显示效率,避免显示异常;牢记 LCD 操作流程:打开设备→内存映射→操作内存→释放映射→关闭设备;32 位 LCD 的像素格式为 ARGB,需将 BMP 的 BGR 格式做对应转换。

Aichirou3的博客 684
上一篇: bmp文件头信息
下一篇: Makefile中关闭DEBUG宏
奔向星辰花海
博客等级 码龄10年 113粉丝 58原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值