BMP

BMP(全称Bitmap)是Window操作系统中的标准图像文件格式

可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),使用非常广。

它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。BMP文件的图像深度可选lbit、4bit、8bit及24bit。BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。

组成

  典型的BMP图像文件由四部分组成:

 

  1:位图头文件数据结构,它包含BMP图像文件的类型、显示内容等信息;

 

  2:位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息;

 

  3:调色板,这个部分是可选的,有些位图需要调色板,有些位图,比如真彩色图(24位的BMP)就不需要调色板;

 

  4:位图数据,这部分的内容根据BMP位图使用的位数不同而不同,在24位图中直接使用RGB,而其他的小于24位的使用调色板中颜色索引值。

对应的数据结构

  1:BMP文件组成

 

  BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。

  2:BMP文件头(14字节)

 

  BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。

 

  其结构定义如下:

 

  typedef struct tagBITMAPFILEHEADER

 

  {

 

  WORD bfType; // 位图文件的类型,必须为BM(1-2字节)

 

  DWORD bfSize; // 位图文件的大小,以字节为单位(3-6字节)

 

  WORD bfReserved1; // 位图文件保留字,必须为0(7-8字节)

 

  WORD bfReserved2; // 位图文件保留字,必须为0(9-10字节)

 

  DWORD bfOffBits; // 位图数据的起始位置,以相对于位图(11-14字节)

 

  // 文件头的偏移量表示,以字节为单位

 

  } BITMAPFILEHEADER;

  3:位图信息头(40字节)

 

  BMP位图信息头数据用于说明位图的尺寸等信息。

 

  typedef struct tagBITMAPINFOHEADER{

 

  DWORD biSize; // 本结构所占用字节数(15-18字节)

 

  LONG biWidth; // 位图的宽度,以像素为单位(19-22字节)

 

  LONG biHeight; // 位图的高度,以像素为单位(23-26字节)

 

  WORD biPlanes; // 目标设备的级别,必须为1(27-28字节)

 

  WORD biBitCount;// 每个像素所需的位数,必须是1(双色),(29-30字节)

 

  // 4(16色),8(256色)或24(真彩色)之一

 

  DWORD biCompression; // 位图压缩类型,必须是 0(不压缩),(31-34字节)

 

  // 1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一

 

  DWORD biSizeImage; // 位图的大小,以字节为单位(35-38字节)

 

  LONG biXPelsPerMeter; // 位图水平分辨率,每米像素数(39-42字节)

 

  LONG biYPelsPerMeter; // 位图垂直分辨率,每米像素数(43-46字节)

 

  DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数(47-50字节)

 

  DWORD biClrImportant;// 位图显示过程中重要的颜色数(51-54字节)

 

  } BITMAPINFOHEADER;

  4:颜色表

 

  颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。RGBQUAD结构的定义如下:

 

  typedef struct tagRGBQUAD {

 

  BYTE rgbBlue;// 蓝色的亮度(值范围为0-255)

 

  BYTE rgbGreen; // 绿色的亮度(值范围为0-255)

 

  BYTE rgbRed; // 红色的亮度(值范围为0-255)

 

  BYTE rgbReserved;// 保留,必须为0

 

  } RGBQUAD;

  颜色表中RGBQUAD结构数据的个数有biBitCount来确定:

 

  当biBitCount=1,4,8时,分别有2,16,256个表项;

 

  当biBitCount=24时,没有颜色表项。

 

  位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下:

 

  typedef struct tagBITMAPINFO {

 

  BITMAPINFOHEADER bmiHeader; // 位图信息头

 

  RGBQUAD bmiColors[1]; // 颜色表

 

  } BITMAPINFO;

  5:位图数据

 

  位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。位图的一个像素值所占的字节数:

 

  当biBitCount=1时,8个像素占1个字节;

 

  当biBitCount=4时,2个像素占1个字节;

 

  当biBitCount=8时,1个像素占1个字节;

 

  当biBitCount=24时,1个像素占3个字节;

 

  Windows规定一个扫描行所占的字节数必须是

 

  4的倍数(即以long为单位),不足的以0填充,

 

  biSizeImage = ((((bi.biWidth * bi.biBitCount) + 31) & ~31) / 8) * bi.biHeight;

 

  具体数据举例:

 

  如某BMP文件开头:

 

  424D 4690 0000 0000 0000 4600 0000 2800 0000 8000 0000 9000 0000 0100*1000 0300 0000 0090 0000 A00F 0000 A00F 0000 0000 0000 0000 0000*00F8 E007 1F00 0000*02F1 84F1 04F1 84F1 84F1 06F2 84F1 06F2 04F2 86F2 06F2 86F2 86F2 .... ....

文件部分

图像文件头

  1)1-2:(这里的数字代表的是"字",即两个字节,下同)图像文件头。0x4d42=’BM’,表示是Windows支持的BMP格式。(注意:查ascii表B 0x42,M0x4d,bfType 为两个字节,B为low字节,M为high字节所以bfType=0x4D42,而不是0x424D,但注意)

 

  2)3-6:整个文件大小。4690 0000,为00009046h=36934。

 

  3)7-8:保留,必须设置为0。

 

  4)9-10:保留,必须设置为0。

 

  5)11-14:从文件开始到位图数据之间的偏移量(14+40+4*(2^biBitCount))。4600 0000,为00000046h=70,上面的文件头就是35字=70字节。

位图信息头

  6)15-18:位图图信息头长度。

 

  7) 19-22:位图宽度,以像素为单位。8000 0000,为00000080h=128。

 

  8)23-26:位图高度,以像素为单位。9000 0000,为00000090h=144。

 

  9)27-28:位图的位面数,该值总是1。0100,为0001h=1。

 

  10)29-30:每个像素的位数。有1(单色),4(16色),8(256色),16(64K色,高彩色),24(16M色,真彩色),32(4096M色,增强型真彩色)。1000为0010h=16。

 

  11)31-34:压缩说明:有0(不压缩),1(RLE 8,8位RLE压缩),2(RLE 4,4位RLE压缩,3(Bitfields,位域存放)。RLE简单地说是采用像素数+像素值的方式进行压缩。T408采用的是位域存放方式,用两个字节表示一个像素,位域分配为r5b6g5。图中0300 0000为00000003h=3。

 

  12)35-38:用字节数表示的位图数据的大小,该数必须是4的倍数,数值上等于(≥位图宽度的最小的4的倍数)×位图高度×每个像素位数。0090 0000为00009000h=80×90×2h=36864。

 

  13)39-42:用象素/米表示的水平分辨率。A00F 0000为0000 0FA0h=4000。

 

  14)43-46:用象素/米表示的垂直分辨率。A00F 0000为0000 0FA0h=4000。

 

  15)47-50:位图使用的颜色索引数。设为0的话,则说明使用所有调色板项。

 

  16)51-54:对图象显示有重要影响的颜色索引的数目。如果是0,表示都重要。

彩色板

  17)(55+0)到(50-1+2^biBitCount):彩色板规范。对于调色板中的每个表项,用下述方法来描述RGB的值:

 

  1字节用于蓝色分量

 

  1字节用于绿色分量

 

  1字节用于红色分量

 

  1字节用于填充符(设置为0)

 

  对于24-位真彩色图像就不使用彩色板,因为位图中的RGB值就代表了每个象素的颜色。

 

  如,彩色板为00F8 0000 E007 0000 1F00 0000 0000 0000,其中:

 

  00F8为F800h = 1111 1000 0000 0000(二进制),是蓝色分量的掩码。

 

  E007 为 07E0h = 0000 0111 1110 0000(二进制),是绿色分量的掩码。

 

  1F00为001Fh = 0000 0000 0001 [1]1111(二进制),是红色分量的掩码。

 

  0000 总设置为0。

 

  将掩码跟像素值进行“与”运算再进行移位操作就可以得到各色分量值。看看掩码,就可以明白事实上在每个像素值的两个字节16位中,按从高到低取5、6、5位分别就是r、g、b分量值。取出分量值后把r、g、b值分别乘以8、4、8就可以补齐第个分量为一个字节,再把这三个字节按rgb组合,放入存储器(同样要反序),就可以转换为24位标准BMP格式了。

图像数据阵列

  18)55(无调色板)-bfSize:每两个字节表示一个像素。阵列中的第一个字节表示位图左下角的象素,而最后一个字节表示位图右上角的象素。

存储算法

  BMP文件通常是不压缩的,所以它们通常比同一幅图像的压缩图像文件格式要大很多。例如,一个800×600的24位几乎占据1.4MB空间。因此它们通常不适合在因特网或者其它低速或者有容量限制的媒介上进行传输。根据颜色深度的不同,图像上的一个像素可以用一个或者多个字节表示,它由n/8所确定(n是位深度,1字节包含8个数据位)。图片浏览器等基于字节的ASCII值计算像素的颜色,然后从调色板中读出相应的值。更为详细的信息请参阅下面关于位图文件的部分。n位2n种颜色的位图近似字节数可以用下面的公式计算:BMP文件大小约等于 54+4*2的n次方+(w*h*n)/8,其中高度和宽度都是像素数。需要注意的是上面公式中的54是位图文件的文件头,是彩色调色板的大小。另外需要注意的是这是一个近似值,对于n位的位图图像来说,尽管可能有最多2n中颜色,一个特定的图像可能并不会使用这些所有的颜色。由于彩色调色板仅仅定义了图像所用的颜色,所以实际的彩色调色板将小于。如果想知道这些值是如何得到的,请参考下面文件格式的部分。由于存储算法本身决定的因素,根据几个图像参数的不同计算出的大小与实际的文件大小将会有一些细小的差别。

BMP图片格式模型的更多相关文章

  1. BMP图片格式模型(2)

    因为公司的主要业务是图像识别相关的,因此对图像处理.识别是我学习的重点.虽然写程序也不少年了,但是对于图像处理领域,我还是一个新兵.对很多基础的概念也还是存在盲区,所以想在边学边做的过程中,对一些概念 ...

  2. BMP图片格式

    BMP图片 BMP采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大.BMP文件的图像深度可选lbit.4bit.8bit及24bit和32bit.BMP文 ...

  3. c语言数字图像处理(一):bmp图片格式及灰度图片转换

    本篇文章首先介绍了bmp图片格式,主要参考wiki上的内容,包括bmp文件的存储方式,对于一些常见的bmp文件格式都给了例子,并且对8位 16位RGB555 16位RGB565格式的bmp文件进行了简 ...

  4. bmp图片格式及读取

    C++读取bmp图片的例子 #include <windows.h> #include <stdio.h> #include <stdlib.h> #include ...

  5. BMP 图片格式

     BMP根据颜色深度,可以分为2(1位).16(4位).256(8位).65536(16位)和1670万(24位)以及32位含有alpha通道.8位图像可以是 索引彩色图像外,也可以是灰阶图像,而索引 ...

  6. linu下C语言之BMP图片操作编程(上)

    BMP文件格式,也被称为位图图像文件或与设备无关的位图文件格式(DIB)或者只是一个位图,是 一个光栅图形 图像文件格式使用 来存储位图,数字,图片,独立的显示设备. 微软已经定义了一个特定的表示颜色 ...

  7. VC++使用CImage在内存中Jpeg转换Bmp图片

    VC++中Jpeg与Bmp图片格式互转应该是会经常遇到,Jpeg相比Bmp在图片大小上有很大优势. 本文重点介绍使用现有的CImage类在内存中进行转换,不需要保存为文件,也不需要引入第三方库. Li ...

  8. BMP图片解析

    本博客参考:https://www.cnblogs.com/l2rf/p/5643352.html 一.简介 BMP(Bitmap-File)图形文件是Windows采用的图形文件格式,在Window ...

  9. PNG,JPEG,BMP,JIF图片格式详解及其对比

    原文地址:http://blog.csdn.net/u012611878/article/details/52215985 图片格式详解 不知道大家有没有注意过网页里,手机里,平板里的图片,事实上,图 ...

随机推荐

  1. Hadoop学习;測试;启动bug;secondary合并edits到fsimage

    一个Hadoop集群拥有多个并行的计算机.用以存储和处理大规模的数据集 Hadoop强调代码向数据迁移 要执行的程序在规模上比数据小的多,更easy移动,此外通过网络移动数据比载入执行程序更花时间,这 ...

  2. 字符串中连续出现最多的子串 &amp; 字符串中最长反复子串

    字符串中连续出现最多的子串 & 字符串中最长反复子串 字符串中连续出现最多的子串 & 字符串中最长反复子串,这两个问题都能够用后缀数组来表示,至于后缀数组能够參考编程珠玑P156:后缀 ...

  3. Struts2中的异步提交(ajaxfileupload异步上传(图片)插件的使用)

    server端採用struts2来处理文件上传. 所需环境: jquery.js ajaxfileupload.js struts2所依赖的jar包 及struts2-json-plugin-2.1. ...

  4. Android基础新手教程——1.5.2 Git之使用GitHub搭建远程仓库

    Android基础新手教程--1.5.2 Git之使用GitHub搭建远程仓库 标签(空格分隔): Android基础新手教程 本节引言: 在上一节中.我们学习了怎样使用Git.构建我们的本地仓库.轻 ...

  5. JUnit4.8.2源码分析-4 RunNotifier与RunListener

    JUnit4运行过程中,org.junit.runner.notification. RunListener和RunNotifier运用了观察者模式. 1.观察者 观察者Observer/Listen ...

  6. 几个常用ORACLE运维监控的SQL语句

    1.消耗CPUSELECT a.CPU_TIME, --CPU时间 百万分之一(微秒)              a.OPTIMIZER_MODE,--优化方式              a.EXEC ...

  7. Linux下grub的配置文件

    GRUB(统一引导装入器)是基本的Linux引导装入器. 其有四个作用,如下: 1.选择操作系统(如果计算机上安装了多个操作系统). 2.表示相应引导文件所在的分区. 3.找到内核. 4.运行初始内存 ...

  8. window如何在命令行关掉端口

    欢迎加入前端交流群来py:749539640   进入cmd netstat -ano | findstr :yourPortNumber taskkill /PID typeyourPIDhere ...

  9. CF 286(div 2) B Mr. Kitayuta's Colorful Graph【传递闭包】

    解题思路:给出n个点,m条边(即题目中所说的两点之间相连的颜色) 询问任意两点之间由多少种不同的颜色连接 最开始想的时候可以用传递闭包或者并查集来做,可是并查集现在还不会做,就说下用传递闭包来做的这种 ...

  10. FCC编程题之中级算法篇(上)

    介绍 FCC: 全称为freeCodeCamp,是一个非盈利性的.面向全世界的编程练习网站.这次的算法题来源于FCC的中级算法题. FCC中级算法篇共分为(上).(中).(下)三篇.每篇各介绍7道算法 ...