bmp文件操作和详解

一 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.mzph.cn/news/173323.shtml

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

相关文章

ubuntu下载vscode并运行程序

如有帮助点赞收藏关注! 如需转载,请注明出处! 好久没有在linux下编译c代码了,由于换了酷炫彩灯的电脑。又要重新安装一次喽。做个记录,可以帮助到有需要的人,接下来不要错过每一个步骤。 我们一起手把手运行…

虹科方案 | 如何破解CAN与车载以太网之间数据传输和协议转换的难题?

导读:在车辆网络时代,数据传输和协议转换在通信领域中扮演着至关重要的角色。它们不仅能够实现车辆内部系统之间的互联互通,还支持车辆与外部网络进行通信,从而为驾驶者带来更智能、便捷的驾驶体验。本文将介绍CAN总线与车载以太网…

3.数据结构

3.1 数据结构分类 常见的数据结构包括数组、链表、栈、队列、哈希表、树、堆、图,它们可以从“逻辑结构”和“物理结构”两个维度进行分类。 3.1.1逻辑结构:线性与非线性 逻辑结构揭示了数据元素之间的逻辑关系。在数组和链表中,数据按照…

大公司为什么喜欢centos系统写爬虫?

CentOS是一个基于Red Hat Enterprise Linux(RHEL)源代码构建的开源操作系统,它受到大企业喜欢大多数因为他系统的稳定性,安全性以及兼容性等。可以为企业提供更多的商业支持。以我个人为例,公司在做爬虫数据抓取多是采…

element-ui 中 el-select 组件选择后不会自动关闭

在使用 el-select 组件时&#xff0c;打开 select 选择框后选择或点击其他元素后不会自动关闭 el-select 框的问题。 我们只需要将在操作后手动让 el-select 失去焦点即可收起下拉框。 <el-select v-model"value1" ref"selectRef" multiple placehold…

位操作/位运算

常用操作一&#xff1a; n 的二进制表示中第 k 位&#xff08;从0位开始算&#xff09;是几 基本思路 先把 n 第 k 位数字移到最后一位&#xff0c;用右移运算 n>>k看个位数字是几&#xff0c;其实就是 x & 1 实际就是&#xff1a;n>>k&1 //最低为从0…

学位论文撰写-经验

记录个人在撰写学位论文过程中遇到的一些问题. 论文敲完Latex后&#xff0c;即初稿完成后&#xff0c;要打印一版出来 &#xff0c;看一下每个章节开头是否放在了奇数页&#xff0c;因此&#xff0c;把文章打印出来看&#xff0c;会方便一些。写完初稿之后&#xff0c;请同学帮…

王者小游戏作业

一、创建好文件、包、类、插入图片文件夹 二、beast包 1、Bear类 package beast; import sxt.GameFrame; public class Bear extends Beast {public Bear(int x, int y, GameFrame gameFrame) {super(x, y, gameFrame);setImg("C:\\Users\\陆先生\\Desktop\\王者荣耀图片…

前置任务之安装jdk

已经安装过很多次了&#xff0c;但是每次安装都要搜好几次才能找到正确的&#xff0c;离大谱。 1.打开 oracle官网 https://www.oracle.com 然后切换到Java archive 下载192版本的&#xff0c;页面搜索ctrlF&#xff0c;【Java SE Development Kit】或者【jdk-8u192-windows-…

深入理解Transformer,兼谈MHSA(多头自注意力)、LayerNorm、FFN、位置编码

Attention Is All You Need——集中一下注意力 Transformer其实不是完全的Self-Attention结构&#xff0c;还带有残差连接、LayerNorm、类似1维卷积的Position-wise Feed-Forward Networks&#xff08;FFN&#xff09;、MLP和Positional Encoding&#xff08;位置编码&#xf…

ChatGPT进阶:提示工程的神秘面纱与实战指南

文章目录 一、提示工程的概念与原理二、提示工程的实践方法三、提示工程的挑战与展望四、实战案例分析总结《ChatGPT进阶&#xff1a;提示工程入门》内容简介作者简介陈颢鹏&#xff1a;李子菡&#xff1a; 目录获取方式 在人工智能领域&#xff0c;对话系统已经成为了一个热门…

C#工程中Form_xx.cs不能在设计器中查看

环境&#xff1a;VS2022 直接上图&#xff1a; 原因&#xff1a; 写了个类在Form_xx.cs中从For继承的部分类之前&#xff0c;移动到之后&#xff0c;保证窗体类是代码中的首个类即可&#xff0c;如图&#xff1a;

实战|信息泄露

0x01系统初探 通过fofa对大学进行搜索 fofa:host"edu.cn" &amp;&amp; status_code"200"在随意的翻阅查看时&#xff0c;发现访问xxx.edu.cn登录页面会优先访问登录后的页面&#xff0c;再跳转至登录页面。盲猜应该是前端校验&#xff0c;可以通过…

基于C#实现奇偶排序

这篇就从简单一点的一个“奇偶排序”说起吧&#xff0c;不过这个排序还是蛮有意思的&#xff0c;严格来说复杂度是 O(N2)&#xff0c;不过在多核的情况下&#xff0c;可以做到 N2 /(m/2)的效率&#xff0c;这里的 m 就是待排序的个数&#xff0c;当 m100&#xff0c;复杂度为 N…

zlmediakit实现rtsp流服务器

本次实现是将内存中的H264数据经过zlmediakit实现为rtsp流。 我是用的是CAPI的方式&#xff0c;将zlmediakit作为一个sdk嵌入到自己的程序中而不是作为一个独立的进进程服务。 1.编译完成zkmedialit后会得到bin include lib三个文件夹如图 其中bin中的MediaServer是作为独立的…

凸包问题的GRAHAM-SCAN解法 open3d c++ 代码

使用了Open3D库进行点云处理和可视化。下面是代码的大致解释: 引入必要的头文件和命名空间: 定义了三个函数: ComputeTriangleDirArea:计算带符号三角形的面积。Compute2Ddistance:计算两点之间的平面距离。GetConvexHullByGrahamScan:通过Graham Scan方法计算凸包点集。…

生成EtherCAT从站XML图片信息方法

0 工具准备 1.PS CS6 2.Hex Editor Neo(文件Hex编辑器) 3.DM3E-556步进电机驱动器 4.TwinCAT(验证XML图片修改效果)1 准备一张需要生成图片信息的图片 根据EtherCAT从站XML图片格式规范,我们需要用到的元素名为ImageData16x14,它要求使用16x14分辨率、深度为16bit的bmp…

基于C#实现鸡尾酒排序(双向冒泡排序)

通俗易懂点的话&#xff0c;就叫“双向冒泡排序”。 冒泡是一个单向的从小到大或者从大到小的交换排序&#xff0c;而鸡尾酒排序是双向的&#xff0c;从一端进行从小到大排序&#xff0c;从另一端进行从大到小排序。 从图中可以看到&#xff0c;第一次正向比较&#xff0c;我们…

Rust语言入门教程(九) - 结构体

格式及语法 在其他很多编程语言中&#xff0c;有类(Class)的存在&#xff0c;在Rust中&#xff0c;我们没有类(Class)的概念&#xff0c;我们使用结构体(Struct)。 与一个结构体相关的有以下几个部分&#xff1a; 数据字段方法关联函数 声明一个结构体及其字段的格式如下&am…

二叉树:leetcode1457. 二叉树中的伪回文路径

给你一棵二叉树&#xff0c;每个节点的值为 1 到 9 。我们称二叉树中的一条路径是 「伪回文」的&#xff0c;当它满足&#xff1a;路径经过的所有节点值的排列中&#xff0c;存在一个回文序列。 请你返回从根到叶子节点的所有路径中 伪回文 路径的数目。 给定二叉树的节点数目…