bmp文件操作和详解

news2024/11/24 8:37:57

一 BMP文件格式

BMP(Bitmap)是Windows操作系统中的标准图像文件格式。
由于windows操作系统的发布时机远早于Linux、Android、IOS等操作系统,因此windows中很多数据格式和算法的标准也是当今所有操作系统必须要兼容的标准数据结构和算法。BMP是当前计算机中图像文件的标准文件格式,因此研究BMP文件格式的意义在于,它是计算机图像学这门课程的必修课。

BMP文件类型可以分成两类:设备相关位图(DDB)和设备无关位图(DIB)。

  1. BMP相较于其他图像格式的特点:
  2. BMP文件不采用任何压缩。BMP是原始的像素数据的集合,文件格式简单易懂。
  3. 图像的扫描方式是按从左到右、从下到上的顺序。
  4. 兼容1、2、4、8、16、32位颜色模式。

BMP文件从头到尾结构如下:

1. bmp文件头(BITMAPFILEHEADER结构)

typedef struct tagBITMAPFILEHEADER {
        WORD    bfType;
        DWORD   bfSize;
        WORD    bfReserved1;
        WORD    bfReserved2;
        DWORD   bfOffBits;
} BITMAPFILEHEADER, FAR*LPBITMAPFILEHEADER,*PBITMAPFILEHEADER;

bfType:’BM’两个可打印字符,用于标识BMP文件。
bfSize:文件大小
bfReserved1:保留,必须设置为0
bfReserved2:保留,必须设置为0
bfOffBits:从文件头到位图数据的偏移。一般来说,24位和32位的值是54(BITMAPINFOHEADER的大小+ BITMAPINFOHEADER的大小),而8位位图的值为1078(BITMAPINFOHEADER的大小+ BITMAPINFOHEADER的大小+颜色表的大小)
2 位图信息头(即BITMAPINFOHEADER结构)

typedef struct tagBITMAPINFOHEADER
{
        DWORD      biSize;
        LONG       biWidth;
        LONG       biHeight;
        WORD       biPlanes;
        WORD       biBitCount;
        DWORD      biCompression;
        DWORD      biSizeImage;
        LONG       biXPelsPerMeter;
        LONG       biYPelsPerMeter;
        DWORD      biClrUsed;
        DWORD      biClrImportant;
} BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;

biSize:信息头大小,即40字节
biWidth:以像素为单位图像的宽度
biHeight:以像素为单位图像的高度。如果为正,说明位图倒立(即数据表示从图像的左下角到右上角),如果为负说明正向
biPlanes:为目标设备说明颜色平面数,总被设置为1
biBitCount:bit/pixel,1、2、4、8、16、24、32
biCompression:图像的压缩类型,最常用的就是0(BI_RGB),表示不压缩
biSizeImages:4字节,说明位图数据的大小,当用BI_RGB格式时,可以设置为0
biXPelsPerMeter:表示水平分辨率,单位是像素/米,有符号整数
biYPelsPerMeter:表示垂直分辨率,单位是像素/米,有符号整数
biClrUsed:位图使用的调色板中的颜色索引数,为0说明使用所有
biClrImportant:对图像显示有重要影响的颜色索引数,为0说明都重要

另外需要注意的是,位图的每显示一行的扫描线长度总是4字节对齐的,计算方法是:
(width* biBitCount&31+ width* biBitCount)/4,不足的要补0,否则会导致文件格式解析错误。

3. 调色板(只存在于8位位图, 即RGBQUAD[256]数组)

typedef struct tagRGBQUAD {
        BYTE    rgbBlue;
        BYTE    rgbGreen;
        BYTE    rgbRed;
        BYTE    rgbReserved;
} RGBQUAD;

当位图是8bit时,像素值代表调色板的索引值。显示器很早就可以支持24位色,此模式主要用于减小文件大小和历史兼容。显示8位位图的像素值时,在调色板中按照索引值找到调色板中索引对应的红黄蓝三颜色的值,在显示器上显示对应的该24位颜色值。

4.位图数据

即像素值。24位像素值按照red,green,blue顺序排列。32位色按照ALPHA,red,green,blue顺序排列,alpha值代表透明度。16位比较特殊,一般是按照5:6:5的顺序表示red,green,blue这3种颜色的值。

二 BMP位图像素操作

1. 将24位位图转换为8位

创建并在调色板中构造合适的24位颜色值,然后将24位(或者32位)位图的颜色值修改为调色板中的索引值。为了简单,代码中将颜色值修改为依此递增的白色。因为纯白色的颜色值为0xffffff(红绿蓝三色的值必须相等,否则将会呈现三者之中值较大的那种颜色,而且三者的值越大,越加趋向于纯白色),所以调色板中的24位色是从010101,020202,030303,…,ffffff依次递增的256种、从灰色到纯白色的颜色值。

结果示例:
在这里插入图片描述

若是颜色表中不是这种排序,将会导致的结果如下(以绿色蓝色分量为0为例子):
在这里插入图片描述

2. 位图像素操作

使用代码实现区域像素的平移、在bmp图像中画白色矩形的操作。
因为一般的bmp文件是倒序存放的,即显示时的第一行位于位图数据文件的最后一行,最后一行位于位图文件的第一行中。为了操作和计算方便,需要将位图中扫描线翻转,操作之后,再将像素的扫描线翻转回去。具体实现看代码。
区域平移效果示例:
在这里插入图片描述

画矩形的效果示例:

在这里插入图片描述

平移并画矩形的效果示例:
在这里插入图片描述

工程代码如下:
https://download.csdn.net/download/m0_37567738/88571695

注意:代码编译时在“设置”->“c++”->“预处理器”->“预处理器定义”中添加” _CRT_SECURE_NO_WARNINGS”

三 参考链接

  1. c++将24位bmp转8位bmp灰度, 8位bmp灰度反色,24位转3张8位bmp灰度图
  2. bmp文件结构

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

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

相关文章

推动企业数字化转型,如何更好地规避失败风险?

随着科技的飞速发展,数字化转型已成为企业持续发展的必然选择,然而有相关数据显示,超过80%的企业在数字化转型过程中都遭遇失败。本文将揭示企业数字化转型常见的失败原因,并探讨如何帮助企业规避转型失败风险。 一、企业数字化转…

Android修行手册 - 使用ViewPager2实现画廊效果

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分…

青少年CTF之PHP特性练习(1-5)

青少年CTF-PHP特性练习 文章目录 青少年CTF-PHP特性练习PHP特性01PHP特性02PHP特性03PHP特性04PHP特性05 PHP特性01 看给出的源码&#xff0c;两个变量的值加密后的MD5相同 <?php$s1 "%af%13%76%70%82%a0%a6%58%cb%3e%23%38%c4%c6%db%8b%60%2c%bb%90%68%a0%2d%e9%47…

使用Arthas排查性能问题

Arthas 是一款线上监控诊断产品&#xff0c;通过全局视角实时查看应用 load、内存、gc、线程的状态信息&#xff0c;并能在不修改应用代码的情况下&#xff0c;对业务问题进行诊断&#xff0c;包括查看方法调用的出入参、异常&#xff0c;监测方法执行耗时&#xff0c;类加载信…

小程序----使用图表显示数据--canvas

需求&#xff1a;在小程序上实现数据可视化 思路&#xff1a;本来想用的是echarts或者相关的可视化插件&#xff0c;但因为用的是vue3&#xff0c;大多数插件不支持&#xff0c;所以用了echarts&#xff0c;但最后打包的时候说包太大超过2M无法上传&#xff0c;百度了一下&…

汽车功能安全ISO26262

一、功能安全基本概念及功能安全管理 什么是功能安全 相关标准&#xff1a; 现状&#xff1a; 功能安全的目的和范围&#xff1a; 总体框架&#xff1a; 基本定义&#xff1a;

vue3中toRaw 与 markRaw

toRaw 返回由 reactive 或 readonly 方法转换成响应式代理的普通对象。 这是一个还原方法&#xff0c;可用于临时读取&#xff0c;访问不会被代理/跟踪&#xff0c;写入时也不会触发界面更新。 markRaw 标记一个对象&#xff0c;使其永远不会转换为代理。返回对象本身 应…

企业软件手机app定制开发新趋势|网站小程序搭建

企业软件手机app定制开发新趋势|网站小程序搭建 随着移动互联网的快速发展和企业数字化转型的加速&#xff0c;企业软件手机App定制开发正成为一个新的趋势。这种趋势主要是由于企业对于手机App的需求增长以及现有的通用应用不能满足企业特定需求的情况下而产生的。 首先&#…

解决:AttributeError: module ‘os’ has no attribute ‘mknod’

解决&#xff1a;AttributeError: module ‘os’ has no attribute ‘mknod’ 文章目录 解决&#xff1a;AttributeError: module os has no attribute mknod背景报错问题报错翻译报错位置代码报错原因解决方法今天的分享就到此结束了 背景 在使用之前的代码时&#xff0c;报错…

小航助学题库蓝桥杯题库stem选拔赛(21年3月)(含题库教师学生账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSDN博客 需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSD…

小航助学题库蓝桥杯题库stem选拔赛(22年1月)(含题库教师学生账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSDN博客 需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSD…

【JDK21】详解虚拟线程

目录 1.概述 2.虚拟线程是为了解决哪些问题 2.1.线程切换的巨大代价 2.2.哪些情况会造成线程的切换 2.3.线程资源是有限的 3.虚拟线程 4.适用场景 1.概述 你发任你发&#xff0c;我用JAVA8&#xff1f;JDK21可能要对这句话say no了。 现在Oracle JDK是每4个版本&#x…

Android系统源码中添加可编译运行执行程序,C,C++

文章目录 Android系统源码中添加可编译运行执行程序&#xff0c;C&#xff0c;C1. 源码product分区中添加可执行程序 Android系统源码中添加可编译运行执行程序&#xff0c;C&#xff0c;C 1. 源码product分区中添加可执行程序 新建一个文件夹&#xff0c;以及一个test.cpp文…

【设计模式】03:单例模式

单例模式 OVERVIOW 单例模式1.单例模式实现2.饿汉与懒汉&#xff08;1&#xff09;饿汉模式&#xff08;2&#xff09;懒汉模式 3.懒汉线程安全1&#xff08;1&#xff09;引入互斥锁&#xff08;2&#xff09;引入双重检查锁定&#xff08;3&#xff09;引入原子变量 4.懒汉线…

RWA+AI 叙事下的 ProsperEx,对 Web3 时代交易的重新定义

RWA&#xff08;Real World Assets&#xff09;即现实资产代币&#xff0c;其本质在于将现实世界中具有货币价值的东西转化为数字代币&#xff0c;使其可以在区块链上表现价值并进行交易。RWA 资产既可以包括有形资产&#xff0c;例如房产、珠宝、黄金等&#xff0c;也可以包无…

第一节HarmonyOS DevEcoStudio工具下载以及环境搭建

一、下载与安装DevEco Studio 在HarmonyOS应用开发学习之前&#xff0c;需要进行一些准备工作&#xff0c;首先需要完成开发工具DevEco Studio的下载与安装以及环境配置。 进入DevEco Studio 工具下载官网&#xff1a;https://developer.harmonyos.com/cn/develop/deveco-stu…

OpenCvSharp从入门到实践-(04)色彩空间

目录 1、GRAY色彩空间 2、从BGR色彩空间转换到GRAY色彩空间 2.1色彩空间转换码 2.2实例 BGR色彩空间转换到GRAY色彩空间 3、HSV色彩空间 4、从BGR色彩空间转换到HSV色彩空间 4.1色彩空间转换码 4.2实例 BGR色彩空间转换到HSV色彩空间 1、GRAY色彩空间 GRAY色彩空间通常…

上游任务和下游任务

起源多任务学习中的定义理解结合定义分析例子示例 1&#xff1a;计算机视觉示例 2&#xff1a;自然语言处理示例 3&#xff1a;语音处理示例 4&#xff1a;强化学习总结 起源 "上游任务"和"下游任务"这两个术语在深度学习领域中通常用来描述一种 多任务学…

适用于iOS 的顶级苹果数据恢复软件

数据丢失可能随时发生在任何人身上&#xff0c;这可能是一种令人沮丧的经历。丢失 iOS 设备上的重要数据可能会造成特别严重的损失&#xff0c;因为其中可能包括有价值的照片、联系人、消息和其他重要文件。幸运的是&#xff0c;有多种数据恢复工具可以帮助用户恢复丢失的数据。…

Java数据结构与算法----字符串匹配(KMP算法)

KMP算法简介 是一种线性时间复杂度的字符串匹配、查找算法。 暴力实现字符串匹配 对于字符串的匹配&#xff0c;可以使用暴力进行匹配&#xff1a; 如图进行演示:&#xff08;以a串 ABABABCAA 被b串 ABABC 匹配为例&#xff09;&#xff1a; 第一轮匹配&#xff1a;&#x…