BMP图片解析
本博客参考:https://www.cnblogs.com/l2rf/p/5643352.html
一.简介
| 数据段名称 | 大小(byte) | 开始地址 | 结束地址 |
|
位图文件头(bitmap-file header)
|
14 | 0000h | 000Dh |
|
位图信息头(bitmap-information header)
|
40 | 000Eh | 0035h |
|
调色板(color table)
|
由biBitCount决定 | 0036h | 未知 |
|
图片点阵数据(bitmap data)
|
由图片大小和颜色定 | 未知 | 未知 |
#pragma pack(2) //让下面结构体2字节对齐访问,不然读取到这结构体的信息不对,因为默认是4字节对齐访问
typedef struct tagBITMAPFILEHEADER
{
unsigned short bfType; //2Bytes,BMP图片格式,"BM",即0x424D
unsigned long bfSize; //4Bytes,整个BMP文件的大小
unsigned short bfReserved1; //2Bytes,保留,为0
unsigned short bfReserved2; //2Bytes,保留,为0
unsigned long bfOffBits; //4Bytes,文件起始位置到图像像素数据的字节偏移量
}BMP_FILE_HEADER;
#pragma pack()
| 变量名 | 地址偏移 | 大小 | 作用说明 |
| bfType | 0000h | 2Bytes |
文件标识符,必须为"BM",即0x424D 才是Windows位图文件
‘BM’:Windows 3.1x, 95, NT,… ‘BA’:OS/2 Bitmap Array ‘CI’:OS/2 Color Icon
‘CP’:OS/2 Color Pointer ‘IC’:OS/2 Icon
‘PT’:OS/2 Pointer
因为OS/2系统并没有被普及开,所以在编程时,你只需判断第一个标识“BM”就行
|
| bfSize | 0002h | 4Bytes | 整个BMP文件的大小(以位B为单位),比利用像素求出的字节数多一点 |
| bfReserved1 | 0006h | 2Bytes | 保留,必须设置为0 |
| bfReserved2 | 0008h | 2Bytes | 保留,必须设置为0 |
| bfOffBits | 000Ah | 4Bytes | 说明从文件头0000h开始到图像像素数据的字节偏移量(以字节Bytes为单位),以为位图的调色板长度根据位图格式不同而变化,可以用这个偏移量快速从文件中读取图像数据 |
unsigned long biSize; //4Bytes,BMP_INFO_HEADER结构体大小
long biWidth; //4Bytes,图像宽度(以像素为单位)
long biHeight; //4Bytes,图像高度,+:图像存储顺序为Bottom2Top,-:Top2Bottom
short biPlanes; //2Bytes,图像数据平面,BMP存储RGB数据,因此总为1
unsigned short biBitCount; //2Bytes,图像像素深度
unsigned int biCompression; //4Bytes,0:不压缩,1:RLE8,2:RLE4
unsigned long biSizeImage; //4Bytes,4字节对齐的图像数据大小
long biXPelsPerMeter; //4 Bytes,用象素/米表示的水平分辨率
long biYPelsPerMeter; //4 Bytes,用象素/米表示的垂直分辨率
unsigned long biClrUsed; //4 Bytes,实际使用的调色板索引数,0:使用所有的调色板索引
unsigned long biClrImportant; //4 Bytes,重要的调色板索引数,0:所有的调色板索引都重要
}BMP_INFO_HEADER;
#pragma pack()
|
变量名
|
地址偏移
|
大小
|
作用说明
|
|
biSize
|
000Eh
|
4Bytes
|
BNP信息头即BMP_INFOHEADER结构体所需要的字节数(以字节为单位)
|
|
biWidth
|
0012h
|
4Bytes
|
说明图像的宽度(以像素为单位)
|
|
biHeight
|
0016h
|
4Bytes
|
说明图像的高度(以像素为单位)。这个值的正负,指明图像是正向的位图还是倒向的位图。
该值是正数说明图像是倒向的即图像存储是由左到右,由下到上; 该值是负数说明图像是正向的即图像存储是由左到右,由上到下。大多数BMP位图是倒向的位图,所以此值是正值。 |
|
biPlanes
|
001Ah
|
2Bytes
|
为目标设备说明位面数,其值总设置为1
|
|
biBitCount
|
001Ch
|
2Bytes
|
说明一个像素深度(以比特位/像素位单位),其值可为1,4,8,16,24或32
|
|
biCompression
|
001Eh
|
4Bytes
|
说明图像数据的压缩类型,取值范围为:
0 BI_RGB 不压缩(最常用)
1 BI_RLE8 8比特游程编码(BLE),只用于8位位图
2 BI_RLE4 4比特游程编码(BLE),只用于4位位图
3 BI_BITFIELDS比特域(BLE),只用于16/32位位图
4
|
|
biSizeImage
|
0022h
|
4Bytes
|
说明图像的大小,以字节为单位。当用BI_RGB格式时,总设置为0
|
|
biXPelsPerMeter
|
0026h
|
4Bytes
|
说明水平分辨率,用像素/米表示,有符号整数
|
|
biYPelsPerMeter
|
002Ah
|
4Bytes
|
说明垂直分辨率,用像素/米表示,有符号整数
|
| biClrUsed | 002Eh | 4Bytes | 说明位图实际使用的调色板索引数,0:使用所有的调色板索引 |
| biClrImportant | 0032h | 4Bytes | 说明对图像显示有重要影响的颜色索引的数目,如果是0,表示都重要。 |
BMP图片解析的更多相关文章
- BMP图片的解析,关于压缩方式
在做一个显示bmp图片到lcd屏的时候,发现有些bmp图显示不对. 同样是16bit bmp却有差异. 就查了一下格式. bmp文件格式 位图文件的组成 结构名称 符号 位图文件头(bitmap-fi ...
- 提取bmp图片的颜色信息,可直接framebuffer显示(c版本与python版本)
稍微了解了下linux的framebuffer,这是一种很简单的显示接口,直接写入像素信息即可 配置好的内核,会有/dev/fbn 的接口,于是想能否提前生成一个文件,比如logo.fb,里面仅包含像 ...
- 简单bmp图片处理工具——python实现
预备实现功能: 1.读取bmp文件 2.保存bmp文件 3.对bmp图片进行放大.缩小 4.对bmp图片进行灰度化 5.对bmp图片进行旋转 bmp文件格式非常简单,对于我这种初学者来说减少了不少不必 ...
- c语言数字图像处理(一):bmp图片格式及灰度图片转换
本篇文章首先介绍了bmp图片格式,主要参考wiki上的内容,包括bmp文件的存储方式,对于一些常见的bmp文件格式都给了例子,并且对8位 16位RGB555 16位RGB565格式的bmp文件进行了简 ...
- AS3.0 位图(BMP)解析类
/** * *-----------------------------* * | *** BMP格式解析类 *** | * *-----------------------------* * * 编 ...
- 音视频入门-03-RGB转成BMP图片
* 音视频入门文章目录 * BMP 文件格式解析 BMP 文件由文件头.位图信息头.颜色信息和图形数据四部分组成. 位图文件头(14个字节) 位图信息头(40个字节) 颜色信息 图形数据 文件头与信息 ...
- 【VC++技术杂谈006】截取电脑桌面并将其保存为bmp图片
本文主要介绍如何截取电脑桌面并将其保存为bmp图片. 1. Bmp图像文件组成 Bmp是Windows操作系统中的标准图像文件格式. Bmp图像文件由四部分组成: (1)位图头文件数据结构,包含Bmp ...
- 读取bmp图片数据
public void getBMPImage(String source) throws Exception { clearNData(); //清除数据保存区 FileInputStream fs ...
- bmp图片的有关操作
读取bmp图片 并生成新的bmp图片 #include "stdafx.h"#include <windows.h>#include <cmath>#inc ...
随机推荐
- 密钥对格式转换:JKS到PEM
此处脚本用途:Tomcat的JKS转换成Nginx的PEM格式. #!/bin/bash export JKS=$1 export PASS=$2 NAME=$(basename "$JKS ...
- iOS 编译过程原理(2)
一.前言 <iOS编译过程的原理和应用>文章介绍了 iOS 编译相关基础知识和简单应用,但也很有多问题都没有解释清楚: Clang 和 LLVM 究竟是什么 源文件到机器码的细节 Link ...
- 我遇到的一个ClassNotFoundException问题
近期,使用socket进行进程间Object通信,但是总是报ClassNotFoundException错误. 查找了很多原因,均没有解决. 通过写入文件,查看Object发送的消息内容到底是何种格式 ...
- 8.MSFvenom
Meterpreter 01 Meterpreter API调用 Meterpreter提供了多种APl调用,在编写自己的脚本时可以使用这些API来提供额外功能或定制功能. 关于ruby的更多信息,请 ...
- 如何基于layui的laytpl实现数据绑定
想了半天才想起自己园子的登录密码.可想而知,多长时间没登录了 正文一开始用layui做了几个管理系统,所以用起来觉得确实很容易上手,管理后台最常用的就是form和table以及弹窗类.layui提供的 ...
- centos默认终端bash美化、颜色设置
centos默认终端bash是一个很简单的界面,又无法通过像zsh一样直接安装主题和代码高亮插件,但是我们可以在bashrc的配置文件中通过代码实现一部分功能: 1.代码介绍: 这里推荐一篇大佬的文章 ...
- vue 刮刮乐功能实现
<template> <!--游玩区域--> <div class="panel"> <canvas id="canvas&qu ...
- LeetCode | 力扣周赛C题 5370. 设计地铁系统
请你实现一个类 UndergroundSystem ,它支持以下 3 种方法: checkIn(int id, string stationName, int t) 编号为 id 的乘客在 t 时刻进 ...
- 编译安装inotify-tools和监控inotifywait事件
编译安装inotify-tools软件包 1)解包inotify-tools-3.13.tar.gz文件 [root@svr7~]#ls inotify-tools- ...
- 曹工说Redis源码(3)-- redis server 启动过程完整解析(中)
文章导航 Redis源码系列的初衷,是帮助我们更好地理解Redis,更懂Redis,而怎么才能懂,光看是不够的,建议跟着下面的这一篇,把环境搭建起来,后续可以自己阅读源码,或者跟着我这边一起阅读.由于 ...