BMP文件结构读写操作图文c实现

上传人:ni****g 文档编号:510287329 上传时间:2022-10-29 格式:DOC 页数:15 大小:264KB
返回 下载 相关 举报
BMP文件结构读写操作图文c实现_第1页
第1页 / 共15页
BMP文件结构读写操作图文c实现_第2页
第2页 / 共15页
BMP文件结构读写操作图文c实现_第3页
第3页 / 共15页
BMP文件结构读写操作图文c实现_第4页
第4页 / 共15页
BMP文件结构读写操作图文c实现_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《BMP文件结构读写操作图文c实现》由会员分享,可在线阅读,更多相关《BMP文件结构读写操作图文c实现(15页珍藏版)》请在金锄头文库上搜索。

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

2、止图像压缩标准组织提出的格式,TIFF是由部分厂商组织提出的格式,DICOM是医学图像国际标准组织提出的医学图像专用格式。BMP文件是 Windows操作系统所推荐和支持的图像文件格式,是一种将内存或显示器的图像数据不经过压缩而直接按位存盘的文件格式,所以称为位图(bitmap)文件,因其文件扩展名为BMP,故称为BMP文件格式,简称 BMP文件。本书对图像的算法编程都是针 对BMP图像文件的,因此在本章中我们详细介绍BMP文件结构及其读写操作,以加深对图像数据的理解。1.2.1 BMP文件结构如图1-7所示,BMP图像文件被分成 4个部分:位图文件头(Bit map File Header

3、)、 位图信息头(Bitmap Info Header )、颜色表(Color Map)和位图数据(即图像数据,Data Bits 或 Data Body )。第1部分为位图文件头 BITMAPFILEHEADER,是一个结构体类型,该结构的长度是 固定的,为14个字节。其定义如下:typedef struct tagBITMAPFILEHEADERWORD bfType;DWORD bfSizeWORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER,*PBIT

4、MAPFILEHEADER;BITMAPFILEHEADER 结构的各个域详细说明如下:bfType :位图文件类型,必须是0x424D,即字符串“ BM”也就是说,所有的 “*.bmp ”文件的头两个字节都是“ BM。bfSize:位图文件大小,包括这14个字节。bfReservedl, bfReserved2 : Windows 保留字,暂不用。bfOffBits :从文件头到实际的位图数据的偏移字节数,图1-7中前3个部分的长度之和。BWAPFILEHEADER.怔團文件头biSise bfResemdl bfReservedJhfOflBitsBITMAPIHFOHEADER位图信息头

5、biSiste biWHih biHeight biPlanes biBitCount fciComp ress ion biSizeIinag& biXPlsP&iMeler biYPelsFerMeter biChUsed biClilmportaptbfSize:位图文件大小,包括这14个字节。bfSize:位图文件大小,包括这14个字节。额色表每像隶lbit的位国有2个表项 毎像索牝it的位圏有2我个表项 毎像素24bit的位图设有表项像素按毎行毎列的顺序排列毎讦孚节数扩展成4的倍数J X丿氏位图数据毎表项长度为4字节(32bit)图1-7 BMP文件结构示意图第2部分为位图信息头 B

6、ITMAPINFOHEADER ,也是一个结构体类型的数据结构,该结构 的长度也是固定的,为 40个字节(WORD为无符号16位整数,DWORD为无符号32位整 数,LONG为32位整数)。其定义如下:typedef struct tagBITMAPINFOHEADERDWORD biSize;LONG biWidth;LONG biHeight;WORD biPla nes; WORD biBitCou nt DWORD biCompressio n;DWORD biSizeImage;LONG biXPelsPerMeter;LONG biYPelsPerMeter;DWORD biClr

7、Used;DWORD biCirimporta nt; BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;BITMAPINFOHEADER 结构的各个域的详细说明如下:biSize:本结构的长度,为 40个字节。biWidth :位图的宽度,以像素为单位。biHeight :位图的高度,以像素为单位。biPlanes:目标设备的级别,必须是 1。biBitCount :每个像素所占的位数(bit),其值必须为1 (黑白图像)、4 (16色图)、8 (256色)、24 (真彩色图),新的 BMP格式支持32位色。biCom

8、presssion :位图压缩类型,有效的值为 BI_RGB (未经压缩)、BI_RLE8、BI_RLE4、BI_BITFILEDS (均为 Windows定义常量)。这里只讨论未经压缩的情况,即biCompression=BI_RGB 。biSizeImage:实际的位图数据占用的字节数,该值的大小在第4部分位图数据中有具体解释。biXPelsPerMeter:指定目标设备的水平分辨率,单位是像素/米。biYPelsPerMeter:指定目标设备的垂直分辨率,单位是像素/米。biClrUsed :位图实际用到的颜色数,如果该值为零,则用到的颜色数为2的biBitCount次幕。biClrIm

9、portant :位图显示过程中重要的颜色数,如果该值为零,则认为所有的颜色都是重要的。第3部分为颜色表。颜色表实际上是一个RGBQUAD结构的数组,数组的长度由biClrUsed指定(如果该值为零,则由biBitCount指定,即2的biBitCount次幕个元素)。RGBQUAD结构是一个结构体类型,占4个字节,其定义如下:typedef struct tagRGBQUADBYTE rgbBlue;BYTE rgbGree n;BYTE rgbRed;BYTE rgbReserved;RGBQUAD;RGBQUAD结构的各个域的详细说明如下:rgbBlue:该颜色的蓝色分量;rgbGree

10、 n:该颜色的绿色分量;rgbRed:该颜色的红色分量;rgbReserved:保留字节,暂不用。有些位图需要颜色表;有些位图(如真彩色图)则不需要颜色表,颜色表的长度由BITMAPINFOHEADER 结构中biBitCount分量决定。对于 biBitCount值为1的二值图像, 每像素占1bit,图像中只有两种(如黑白)颜色,颜色表也就有21=2个表项,整个颜色表的大小为1XazeofCRGBQUAD)个字节;对于biBitCount值为8的灰度图像,每像素占8bit,图像中有严一256 颜色,颜色表也就有256个表项,且每个表项的R、G、B分量相等,整个颜色表的大小为256 xazeo

11、fCRGB QUAD) = 1024个字节; 而对于biBitCount=24的真彩色图像,由于每像素3个字节中分别代表了 R、G、B三分量的值,此时不需要颜色表,因此真彩色图的BITMAPINFOHEADER 结构后面直接就是位图数据。第4部分是位图数据,即图像数据,其紧跟在位图文件头、 位图信息头和颜色表 (如果 有颜色表的话)之后,记录了图像的每一个像素值。对于有颜色表的位图,位图数据就是该像素颜色在调色板中的索引值;对于真彩色图,位图数据就是实际的R、G、B值(三个分量的存储顺序是 B、G、R)。下面分别就2色、16色、256色和真彩色位图的位图数据进 行说明:对于2色位图,用1位就可

12、以表示该像素的颜色,所以1个字节能存储8个像素的颜色值。对于16色位图,用4位可以表示一个像素的颜色。所以一个字节可以存储2个像素的颜色值。对于256色位图,1个字节刚好存储1个像素的颜色值。对于真彩色位图,3个字节才能表示1个像素的颜色值。需要注意两点:第一,Windows规定一个扫描行所占的字节数必须是 4的倍数,不足4的倍数则要对 其进行扩充。假设图像的宽为 biWidth个像素、每像素biBitCount个比特,其一个扫描行所 占的真实字节数的计算公式如下:DataSizePerLine = (biWidth * biBitCount /8+ 3) / 4*4那么,不压缩情况下位图数据

13、的大小( BITMAPINFOHEADER 结构中的biSizeimage成员)计算如下:biSizeImage = DataSizePerL ine * biHeight第二,一般来说,BMP文件的数据是从图像的左下角开始逐行扫描图像的,即从下到上、 从左到右,将图像的像素值一一记录下来,因此图像坐标零点在图像左下角。1.2.2 BMP图像文件的读写1.2.2 BMP图像文件的读写分析了 BMP文件结构后,让我们用简单的C程序实现一个给定 BMP位图文件的读写操作,来进一步巩固对图像数据的理解,这也是我们后续图像可视化编程的基础。此部分的代码以及后面两节所讲述的代码在工程chap 1-1中的

14、bmpReadWrite.cpp文件中,读者可以查阅。1. BMP文件的读入BMP文件分为4个组成部分,那么BMP文件的读入也要按照 4个组成部分依次进行处 理,即先处理 BITMAPFILEHEADER 结构,然后是 BITMAPINFOHEADER 结构、颜色表, 最后是位图数据。首先,有关 BITMAPFILEHEADER 、BITMAPINFOHEADER 、RGBQUAD 等结构的定 义包含在头文件 “ Win dows.h中,应把其包含进来。#i nclude Win dows.h|其次,为了后面对图像进行修改及存盘方便,我们定义了几个全局变量,用来存放读入图像的位图数据、宽、高、

15、颜色表及每像素位数等信息。所定义的全局变量如下:un sig ned char *pBmpBuf;读入图像数据的指针int bmpWidth;/ 图像的宽 int bmpHeight;/ 图像的高 RGBQUAD *pColorTable; 颜色表指针 int biBitCou nt;图像类型,每像素位数根据BMP文件结构,BMP文件读入操作的基本流程如图1-8所示。读方式扑开文件9別过DITMAPFILE1IEADER鮭构读入 BITMAPINFOHEADER 結构读入颓邑表读人怖為鮭旅ik Xi闭文舉m 姑去RV帰墅图1-8 BMP文件读入操作流程图readBmp()函数实现了 BMP文件的读取操作,下面的代码是对readBmp()函数的说明和实现。/*

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号