BMP图片内部结构

news/2024/9/28 5:27:13

BMP图片内部结构

​ BMP文件的数据按照从文件头开始的先后顺序分为四个部分:分别是位图文件头、位图信息头、调色板(24bit位图是没有的)、位图数据(RGB)。

(1)位图文件头(Bitmap-File Header)包含了图像类型、图像大小、两个保留字以及位图数据存放地址。

image-20240511192636927

(2)位图信息头(Bitmap-Information Header)包含了位图信息头的大小、图像的宽和高、图像的色深、压缩说明、图像数据的大小和其他一些参数。

image-20240511192644858

(3)调色板是为了让一些颜色深度比较小(1bit、4bit、8bit)的位图可以表示颜色而设置的。调色板存储颜色,后面的位图数据存储颜色索引,这样调色板+位图数据就可以表示颜色了。

16bit、24bit、32bit的位图一般没有调色板,因为从16bit开始就直接使用位图数据表示颜色了。

(4)位图数据分两种情况,如果带调色板,则位图数据存放的是调色板的颜色索引,如果不带调色板,则位图数据存放实际的argb值。由于24位bmp图片不带调色板,所以文件开头的54字节为图片信息,从第55个字节开始就为bmp图片的颜色数据。

当需要读取图像文件信息时,可以从图像文件的相应位置进行数据提取,这是可以定义位图文件头和信息头的结构体,如下:

//取消字节对齐,因为需要的结构体是 14字节和 40字节大小
#pragma pack(1)
//定义图像文件头结构体
typedef struct BMP_FileHeader
{unsigned short int  bfType;           //位图文件的类型,必须为BM unsigned int        bfSize;            //文件大小,以字节为单位unsigned short int  bfReserverd1;     //位图文件保留字,必须为0 unsigned short int  bfReserverd2;     //位图文件保留字,必须为0 unsigned int        bfbfOffBits;       //位图文件头到数据的偏移量,以字节为单位
}BMP_FInfo_t;
//定义图像信息头结构体
typedef  struct BMP_InfoHeader
{ unsigned int biSize;                       //该结构大小,字节为单位unsigned int  biWidth;                     //图形宽度以象素为单位unsigned int  biHeight;                    //图形高度以象素为单位unsigned short int  biPlanes;              //目标设备的级别,必须为1 unsigned short int  biBitcount;            //颜色深度,每个象素所需要的位数unsigned short int  biCompression;         //位图的压缩类型unsigned int  biSizeImage;                 //位图的大小,以字节为单位unsigned int  biXPelsPermeter;             //位图水平分辨率,每米像素数unsigned int  biYPelsPermeter;             //位图垂直分辨率,每米像素数unsigned int  biClrUsed;                   //位图实际使用的颜色表中的颜色数unsigned int  biClrImportant;              //位图显示过程中重要的颜色数
}BMP_InfoHeader_t;#pragma pack()      //开启字节对齐

其中需要注意的是,CPU为了提高数据读取效率,会对结构体的变量进行字节对齐,也就是在32位系统下,结构体变量的字节宽度会自动补齐为 4 的倍数。而位图文件头是 14字节大小,并不是 4的尾数,所以我们需要取消字节对齐,用预处理指令 #pragma pack(n),n为字节对齐数,当 n = 1 时,表示CPU 最小以一个字节读取数据,同理,位图信息头是 40个字节大小,也需要取消字节对齐,当定义结束之后,要恢复字节对齐,直接写 #pragma pack(),n不写时,默认是CPU 本身的对齐字节数。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

使用 Redisson 框架基于 Redis 实现分布式锁

分布式锁可以采用数据库、zookeeper、redis 三种方式实现。 采用数据库实现方式,主要采用表字段的唯一索引特性。数据库是非常昂贵的资源,非常不推荐,最致命就是性能,不要去增加不必要的负担。 采用 zookeeper 的实现方式,主要使用其为客户端创建临时有序节点的特性,在我…

笛卡尔树学习笔记

笛卡尔树 引入 是一种二叉树,每个节点由一个二元组 \((k,w)\) 形成。\(k\) 满足二叉搜索树的性质,\(w\) 满足堆的性质。上面这棵笛卡尔树相当于把数组元素值当作键值 \(w\),而把数组下标当作键值 \(k\)。显然可以发现,这棵树的键值 \(k\) 满足二叉搜索树的性质,而键值 \(w…

ImDisk高级指南:打造你的专属虚拟磁盘空间

ImDisk使用详解和高级用法一、ImDisk使用详解创建虚拟磁盘:使用命令行参数创建虚拟磁盘。例如,imdisk -a -s 10m -m B: 命令将创建一个大小为10MB的虚拟磁盘,并将其分配给B盘符。 你可以使用 -s 参数指定虚拟磁盘的大小,支持的单位包括b、k、m、g、t等,或者使用%表示可用内…

STM CubeMx不能生成代码的解决方法

在使用STM CubeMx时,遇到不能生成代码的问题,即点击“GENERATE CODE”后,软件没有任何反应。 从网上找到若干解决方案,大概是: 以下是可能的解决方法: 1. 确保你已经安装了正确版本的Keil和STM32CubeMX,并且它们都能正常运行。 2. 在STM32CubeMX中点击生成代码按钮之前,…

利用系统IO读取磁盘上指定BMP图片的宽和高以及大小

文件IO代码 /*************************************************************************************** file name: 1.c* author : lu.ciana.598393@gmail.com* date : 2024/05/11* function : 利用系统IO读取磁盘上指定BMP图片的宽和高以及大小* note : n…

雨天的尾巴

[Vani有约会] 雨天的尾巴 /【模板】线段树合并 题目背景 深绘里一直很讨厌雨天。 灼热的天气穿透了前半个夏天,后来一场大雨和随之而来的洪水,浇灭了一切。 虽然深绘里家乡的小村落对洪水有着顽固的抵抗力,但也倒了几座老房子,几棵老树被连根拔起,以及田地里的粮食被弄得一…

[单机]完美国际_V155_GM工具_VM虚拟机

[端游] 完美国际单机版V155一键端PC电脑网络游戏完美世界幻海凌云家园 本教程仅限学习使用,禁止商用,一切后果与本人无关,此声明具有法律效应!!!! 教程是本人亲自搭建成功的,绝对是完整可运行的,踩过的坑都给你们填上了。 如果你是小白也没问题,跟着教程走也是可以搭…

产业园区越来越卷

在经济不断发展和转型升级的大背景下,产业园区作为推动区域经济发展的重要引擎之一,扮演着越来越重要的角色,亦得到了政府、产业巨头、“轻资产”运营商、创投机构等各方力量的持续关注!纵观2023年,产业园区现状如何,在招商、运营、数智化建设等方面,又该如何拨云见日,…