精华内容
下载资源
问答
  • BMP格式详解
    千次阅读
    2021-08-21 23:15:11

    介绍

      数字图像在外存储器设备中的存储形式是图像文件,图像必须按照某个已知的、公认的数据存储顺序和结构进行存储,才能使不同的程序对图像文件顺利进行打开或存盘操作,实现数据共享。图像数据在文件中的存储顺序和结构称为图像文件格式。目前广为流传的图像文件格式有许多种,常见的格式包括BMP、 GIF、JPEG、TIFF、PSD、DICOM、MPEG等。在各种图像文件格式中,一部分是由某个软硬件厂商提出并被广泛接受和采用的格式,例如 BMP、GIF和PSD格式;另一部分是由各种国际标准组织提出的格式,例如JPEG、TIFF和DICOM,其中JPEG是国际静止图像压缩标准组织提出的格式,TIFF是由部分厂商组织提出的格式,DICOM是医学图像国际标准组织提出的医学图像专用格式。

      BMP文件是Windows操作系统所推荐和支持的图像文件格式,是一种将内存或显示器的图像数据不经过压缩而直接按位存盘的文件格式,所以称为位图(bitmap)文件,因其文件扩展名为BMP,故称为BMP文件格式,简称BMP文件。

      BMP文件总体上由4部分组成,分别是位图文件头、位图信息头、调色板和图像数据

    • 位图文件头(bitmap-file header)
    • 位图信息头(bitmap-information header)
    • 彩色表/调色板(color table)
    • 位图数据(bitmap-data)

    数据结构

    //位图文件头
    typedef __packed struct
    {
        uint16_t  bfType ;     //文件标志.固定为'BM',用来识别BMP位图类型
        uint32_t  bfSize ;	   //文件大小,占四个字节
        uint16_t  bfReserved1 ;//保留,总为0
        uint16_t  bfReserved2 ;//保留,总为0
        uint32_t  bfOffBits ;  //从文件开始到位图数据(bitmap data)开始之间的的偏移量
    }BITMAPFILEHEADER ;
    
    //位图信息头
    typedef __packed struct
    {
        uint32_t biSize ;		   	//BITMAPINFOHEADER结构所需要的字数。
        long  biWidth ;		   	    //图象的宽度,以象素为单位 
        long  biHeight ;	   	    //图象的高度,以象素为单位 
        uint16_t  biPlanes ;	    //为目标设备说明位面数,其值将总是被设为1 
        uint16_t  biBitCount ;	   	//比特数/象素,其值为1、4、8、16、24、或32
        uint32_t biCompression ;  	//图象数据压缩的类型。其值可以是下述值之一:
    	                              //BI_RGB:没有压缩;
    	                              //BI_RLE8:每个象素8比特的RLE压缩编码,压缩格式由2字节组成(重复象素计数和颜色索引);  
                                      //BI_RLE4:每个象素4比特的RLE压缩编码,压缩格式由2字节组成
      	                              //BI_BITFIELDS:每个象素的比特由指定的掩码决定。
        uint32_t biSizeImage ;		//图象的大小,以字节为单位。当用BI_RGB格式时,可设置为0  
        long  biXPelsPerMeter ;	    //水平分辨率,用象素/米表示
        long  biYPelsPerMeter ;	    //垂直分辨率,用象素/米表示
        uint32_t biClrUsed ;	  	//位图实际使用的彩色表中的颜色索引数
        uint32_t biClrImportant ; 	//对图象显示有重要影响的颜色索引的数目,如果是0,表示都重要。 
    }BITMAPINFOHEADER ;
    
    //调色板
    typedef __packed struct 
    {
        uint8_t rgbBlue ;    //指定蓝色强度
        uint8_t rgbGreen ;	 //指定绿色强度 
        uint8_t rgbRed ;	 //指定红色强度 
        uint8_t rgbReserved ;//保留,设置为0 
    }RGBQUAD ;
    
    typedef __packed struct
    { 
    	BITMAPFILEHEADER bmfHeader;     //位图文件头
    	BITMAPINFOHEADER bmiHeader;     //位图信息头 
    	uint32_t RGB_MASK[3];			//调色板用于存放RGB掩码.
    	//RGBQUAD bmiColors[256];  
    }BITMAPINFO; 
    

    8位色图片实例讲解

    下面举个实例来讲解:
    在Winhex中打开cat2.bmp图像文件((8位色BMP图像cat2.bmp,分辨率为 200×153,文件大小为31 680字节))

    位图文件头(bitmap-file header)

      位图文件头(bitmap-file header)包含了图像类型、图像大小、图像数据存放地址和两个保留未使用的字段。
      打开WINGDI.h文件,搜索"BITMAPFILEHEADER"就可以定位到BMP文件的位图文件头的数据结构定义。

    typedef __packed struct
    {
        uint16_t  bfType ;     //文件标志.固定为'BM',用来识别BMP位图类型
        uint32_t  bfSize ;	   //文件大小,占四个字节
        uint16_t  bfReserved1 ;//保留,总为0
        uint16_t  bfReserved2 ;//保留,总为0
        uint32_t  bfOffBits ;  //从文件开始到位图数据(bitmap data)开始之间的的偏移量
    }BITMAPFILEHEADER ;
    

    对应图片开始的14个字节数据:
    在这里插入图片描述

    十六进制值描 述
    42 4DBM的ASCII值,在Windows中的BMP文件标识符
    C0 7B 00 007B C0h=31680,是cat2文件的大小
    00 00 00 00保留值,总为0
    36 04 00436h=1078,是图像数据的地址,即文件头+信息头+调色板的长度

    位图信息头(bitmap-information header)

      位图信息头(bitmap-information header)包含了位图信息头的大小、图像的宽高、图像的色深、压缩说明图像数据的大小和其他一些参数。
      打开WINGDI.h文件,搜索"tagBITMAPINFOHEADER"就可以定位到BMP文件的位图信息头的数据结构定义。

    typedef __packed struct
    {
        uint32_t biSize ;		   	//BITMAPINFOHEADER结构所需要的字数。
        long  biWidth ;		   	    //图象的宽度,以象素为单位 
        long  biHeight ;	   	    //图象的高度,以象素为单位 
        uint16_t  biPlanes ;	    //为目标设备说明位面数,其值将总是被设为1 
        uint16_t  biBitCount ;	   	//比特数/象素,其值为1、4、8、16、24、或32
        uint32_t biCompression ;  	//图象数据压缩的类型。其值可以是下述值之一:
    	                              //BI_RGB:没有压缩;
    	                              //BI_RLE8:每个象素8比特的RLE压缩编码,压缩格式由2字节组成(重复象素计数和颜色索引);  
                                      //BI_RLE4:每个象素4比特的RLE压缩编码,压缩格式由2字节组成
      	                              //BI_BITFIELDS:每个象素的比特由指定的掩码决定。
        uint32_t biSizeImage ;		//图象的大小,以字节为单位。当用BI_RGB格式时,可设置为0  
        long  biXPelsPerMeter ;	    //水平分辨率,用象素/米表示
        long  biYPelsPerMeter ;	    //垂直分辨率,用象素/米表示
        uint32_t biClrUsed ;	  	//位图实际使用的彩色表中的颜色索引数
        uint32_t biClrImportant ; 	//对图象显示有重要影响的颜色索引的数目,如果是0,表示都重要。 
    }BITMAPINFOHEADER ;
    

    在这里插入图片描述

    十六进制值描 述
    28 00 00 00cat2.bmp图像的位图信息头大小,40字节
    C8 00 00 0000 00 00 C8 = 200,是cat2图像的宽度,单位像素
    99 00 00 0000 00 00 99 = 153,是cat2图像的高度,单位像素
    01 00总是1
    08 0000 08 = 8,cat2图像的色深,即2的8次幂等于256色
    00 00 00 00压缩方式,0表示不压缩
    8A 77 00 0000 00 77 8A = 30602,是cat2图像的图像数据大小,单位字节
    12 0B 00 0000 00 0B 12 = 2834,cat2图像的水平分辨率,单位像素/m
    12 0B 00 0000 00 0B 12 = 2834,cat2图像的垂直分辨率,单位像素/m
    00 00 00 00cat2图像使用的颜色数,0表示使用全部颜色
    00 00 00 00cat2图像中重要的颜色数,0表示所有颜色都重要

    彩色表/调色板(color table)

    接下来是调色板数据,根据BMP文件结构的定义,因为cat2.bmp图像是256色的位图,所以应该有256个调色板,每个调色板占4字节,整 个调色板一共1024字节大小。 cat2.bmp图像文件的调色板数据如下图:
    在这里插入图片描述
    cat2.bmp图像的调色板地址从00000036h开始存储
    在这里插入图片描述
    cat2.bmp图像的调色板数据结束地址是00000435h

    cat2.bmp图像的调色板地址从00000036h开始到00000435h结束,即00000435h - 00000036h + 1 =400h = 1024 bytes。
    如果想查看cat2图像的调色板对应的实际显示颜色,可以使用Adobe Photoshop CS打开cat2.bmp,在Adobe Photoshop CS的菜单栏中选择"图像"→"模式"→"颜色表",即可观看cat2的调色板
    在这里插入图片描述
      cat2.bmp的调色板颜色和十六进制数据是一一对应的。在Adobe Photoshop CS的调色板上单击任何一个像素的颜色即可弹出一个拾色器对话框显示该像素颜色的详细组成信息。cat2.bmp调色板和cat2.bmp的十六进制数据 的对应关系如图。
    在这里插入图片描述

    位图数据(bitmap-data)

      接下来就是位图数据了,根据BMP文件结构的定义,如果一个图像有调色板,那么紧跟在调色板后面的是图像的数据,这些数据不是实际的颜色值,而是指向调色板数组的索引,根据索引来获取调色板中的颜色,如图
    在这里插入图片描述
      因为cat2.bmp是256色的位图,即采用了8位色深作为指向调色板数组的索引,所以根据上图显示的数据可以得知:49 49 49 B1 49 49 49 49 49 99。表示cat2.bmp位图左下角第1个像素的颜色等于调色板[49];第2个像素的颜色等于调色板[49] ;第3个像素的颜色等于调色板[49] ;第4个像素的颜色等于调色板[B1];第5个像素的颜色等于调色板[49] ……依此类推。

    24位色图片实例讲解

      cat1.bmp图像是24位色图像,根据BMP文件结构定义得知,cat1.bmp图像没有调色板,图像数据存储的是实际的颜色数据,每个像素用 3字节表示,分别是红绿蓝。由于cat1.bmp和cat2.bmp的位图文件头和位图信息头结构一样,所以cat1.bmp的位图文件头和位图信息头可以参考上面对cat2.bmp的分析,下面从cat1.bmp的位图信息头结束的位置开始分析,如图
    在这里插入图片描述
      上图可以看到表示每个像素的红绿蓝三色的值,实际存放的时候是倒过来存放的,在分析BMP图像格式时需要注意这点。

    省略文件头重复数据

      通过上面对BMP文件存储结构的分析发现,BMP文件的位图文件头和位图信息头存在着大量的重复数据。如果存储大量同一色深的BMP位图,必然会浪费大量存储空间,所以很多时候游戏编程人员都会去掉BMP文件头和信息头,只保留几个必要的信息和图像数据,那么BMP文件头和信息头中哪几个字段是必须 保留的呢?

      使用Winhex的文件比较功能比较两个24位色深的BMP图像文件,观察两个文件的文件头和信息头有什么不同的地方,如图。
    在这里插入图片描述
      从上图可以看出,两个色深相同的BMP图像的文件头和信息头一共有4处不同的地方,分别是文件头的文件大小、信息头的图像宽度、图像高度和图像数据大小。

      所以很多时候,游戏编程人员只保留图像文件的文件大小、图像宽度、图像高度和图像数据大小信息,甚至有时不需要保留文件大小这个数值,使用图像数据大小数值即可。

      在分析未知文件存储格式时,如果遇到去掉了文件头的文件时,如上面所说的BMP文件,会给分析未知文件格式带来一定的困难。这时需要使用十六进制编 辑器的文件比较功能,观察两个同类的未知文件格式寻找某些潜在的规律,如果实在观察不出规律的,那只能使用白盒分析方法,对调用此未知文件格式的程序进行反汇编跟踪调试了。当然,有时灵感和运气也很重要。

    位图文件大小的精准计算方法

    8位色

      8位(bit)位图:图片中有28=256种颜色,具体哪256种颜色可由调色板灵活规定,因此每个像素点最多有256种情况(颜色),用1字节来表示就可以了。
      一幅512×512的8位位图大小计算方法:
    位图文件头(14字节00000000h开始到0000000Dh)+
    位图信息头(40字节0000000Eh开始到00000035h)+
    调色板(256色,每个颜色4字节,256*4=1024, 00000036h开始到00000435h)+
    实际像素点占内存(512×512×1字节)=263 222字节(Byte)。

    24位色

      24位位图:又名RGB真彩色图,含224=16 777 216=16M色,没有彩色表,原因上文已说明。每个像素点由3个字节(十六进制码6位)表示,每个字节负责控制一种颜色,分别为蓝(Blue)、绿(Green)、红(Red)。
      一幅256×256的24位位图大小计算方法:
    位图文件头(14字节00000000h开始到0000000Dh)+
    位图信息头(40字节0000000Eh开始到00000035h)+
    实际像素点占内存(256×256×3字节)=196 662字节(Byte)。

    补零

      需要注意的是,Windows有“补零”的习惯!即要求位图的每一行像素所占字节数必须被4整除。若不能倍4整除,则在该位图每一行的十六进制码末尾“补”1至3个字节的“00”。

      例如:一幅宽253×高256的24位位图,微软在生成该图为实际文件时,计算每一行像素所占字节=宽253×3字节=759字节,检验其被4除余1,则在每行的十六进制码末尾加1个字节,补“00”,变为760字节。因此我们计算该图大小时应先判断是否“补零”,再得出算法:该图大小=位图文件头(14字节)+位图信息头(40字节)+实际像素点占内存(高256×每行760字节)=194614字节(Byte)。
       有趣的是,“补零”只针对位图的宽进行检验,一幅宽256×高253的24位位图,其大小=位图文件头(14字节)+位图信息头(40字节)+实际像素点占内存(高253×每行768字节)=194358字节(Byte)< 196 662字节(Byte)。这样,只是把此图像的宽和高颠倒,图像所占内存竟然变小了。

    更多相关内容
  • 主要介绍了Android中把bitmap存成BMP格式图片的方法,需要的朋友可以参考下
  • lena bmp格式的图像

    2018-11-21 14:25:20
    lena bmp格式的图像,可以用于图像处理方面的实验。。
  • 主要介绍了C++针对bmp格式解析实例,设计CWnd框架的使用及位图的操作,需要的朋友可以参考下
  • 与直接用软件转化图片格式不用,此代码可以无损转换图片格式
  • ORL人脸数据集,包括40个人,每个人10张照片,每张图片的格式bmp灰色图,人脸识别的经典数据集。格式和分类非常一目了然,方便训练。
  • c语言 jpg转换bmp格式 不用任何库 无错误 正确运行 c语言 jpg转换bmp格式 不用任何库 无错误 正确运行 c语言 jpg转换bmp格式 不用任何库 无错误 正确运行
  • 用VS2015实现bmp格式的图片的读操作并显示出来,点击打开按钮,可以打开任意文件路径下的bmp格式的文件,也就是说,8位,24位的bmp都能显示
  • BMP文件的图像深度可选lbit、4bit、8bit及24bit。BMP文件存储数据时,图像的扫描方式是按从...由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式
  • 24位真彩BMP格式

    2019-03-18 01:55:54
    NULL 博文链接:https://c-shadow.iteye.com/blog/646987
  • bmp格式的图片又称位图,在图像色彩变换中最为简单,操作简单易懂,适合初学者及需要这部分代码的开发者,本例程专门列出24位真彩图转8位灰度图部分的完整代码,并附有详细的注释,对了解bmp图片的协议和数据操作有...
  • BMP格式指纹处理程序

    2021-01-14 20:27:28
    含图像细化、特征点提取程序。c++实现,底层通过C实现
  • AR人脸图片 BMP格式.7z

    2020-08-10 14:46:18
    经典的AR人脸识别数据集。bmp格式,像素768*576。分为正常、墨镜遮挡、围巾遮挡、光照变化、表情变化等情况。(文件过大,慢慢下载)
  • bmp格式转rgb565格式,然后再framebuffer里面填充即可方便显示,
  • BMP格式图像显示界面

    2015-03-16 15:42:54
    该程序是基于VC++ MFC的BMP格式图像显示界面可以直接运行
  • bmp格式转rle

    2015-05-04 13:04:18
    android logo 图片格式转换,bmp格式转rle格式
  • 软件中需要的小图片大全,自己一直用的,16*16大小,bmp格式
  • 可以用来拍摄一张图片,转BMP格式再压缩成JPEG格式,数据保存再外部flash,可以直接将数据发给上位机显示图片。需要的可以拿去用。
  • 用于全国大学生智能车竞赛室内AI视觉组别的图像库。BMP格式
  • 头部扫描医学CT图像,文件格式bmp,图像大小512x512,图像清晰,质量绝对OK,请放心下载~~~~~
  • 用C语言完成的,将png格式和jpeg格式的图片显示出来,以及转化为bmp格式的功能,其中还附加了一些图片放大缩小和图片旋转的小功能
  • 因为jdk只识别jpg、png、gif这三种格式的在使用java的时候会需要将bmp格式的图片文件转换成jpg、png、gif等格式,使用此代码可将bmp格式转换成jpg格式,能否转换成其他格式的文件还没有测试
  • 串口传图像(串口摄像头),OV7670采集.bmp格式照片,通过串口传到上位机显示,含上位机exe软件.
  • 提供两个程序,能够分别完成raw格式图像转换为bmp格式图像和bmp格式图像转换为raw格式图像,程序基于vs2010编写
  • 主要介绍了delphi实现将BMP格式图形转化为JPG格式图形的方法,通过简单的自定义函数调用系统自带的changefileext及SaveToFile等方法来实现格式转换功能,是非常实用的技巧,需要的朋友可以参考下
  • 主要介绍了matlab 生成.bmp格式的文件,本文以大小为M*N的图片为例,说明头文件格式和内容。需要的朋友可以参考下
  • jpeg转bmp格式

    2016-11-24 11:04:47
    该代码经过实践,能够完成从jpeg到bmp图片的转换,特别是在嵌入式当中,在网络传输时候进行压缩,然后在使用时候进行解压缩,然后显示在屏幕上
  • bmp格式转yuv格式

    2013-05-18 05:07:43
    可以把bmp格式的文件转换成yuv格式的文件
  • ov7670 数据转BMP格式再转JPEG存储+JPEG2+RM04_WIFI2+网络命令+串口图像+验收版

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 107,448
精华内容 42,979
关键字:

bmp格式

友情链接: ID卡识别.rar