BMP图像结构

BMP图像结构
BMP图像结构

BMP文件结构详解

2008-11-02 13:26

1. BMP文件组成

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

BMP文件头数据结构含有BMP文件的类型、文件大小和位图起其结构定义如下:

typedef struct tagBITMAPFILEHEADER

{

WORDbfType; // 位图文件的类型,必须为BM

DWORD bfSize; // 位图文件的大小,以字节为单位WORDbfReserved1; // 位图文件保留字,必须为0 WORDbfReserved2; // 位图文件保留字,必须为0

DWORD bfOffBits; // 位图数据的起始位置,以相对于位图

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

} BITMAPFILEHEADER;

3. 位图信息头

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

typedef struct tagBITMAPINFOHEADER{

DWORD biSize; // 本结构所占用字节数

LONGbiWidth; // 位图的宽度,以像素为单位

LONGbiHeight; // 位图的高度,以像素为单位

WORD biPlanes; // 目标设备的级别,必须为1

WORD biBitCount// 每个像素所需的位数,必须是1(双色),

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

DWORD biCompression; // 位图压缩类型,必须是0(不压缩),

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

DWORD biSizeImage; // 位图的大小,以字节为单位LONGbiXPelsPerMeter; // 位图水平分辨率,每米像素数LONGbiYPelsPerMeter; // 位图垂直分辨率,每米像素数DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数DWORD biClrImportant;// 位图显示过程中重要的颜色数

} BITMAPINFOHEADER;

4. 颜色表

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

typedef struct tagRGBQUAD {

BYTErgbBlue;// 蓝色的亮度(值范围为0-255) BYTErgbGreen; // 绿色的亮度(值范围为0-255)

BYTErgbRed; // 红色的亮度(值范围为0-255) BYTErgbReserved;// 保留,必须为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填充,

一个扫描行所占的字节数计算方法:

DataSizePerLine= (biWidth* biBitCount+31)/8;

// 一个扫描行所占的字节数

DataSizePerLine= DataSizePerLine/4*4; // 字节数必须是4的倍位图数据的大小(不压缩情况下):

DataSize= DataSizePerLine* biHeight;

bmp位图文件详解

2009-08-20 10:41

位图格式BMP是bitmap的缩写形式,bitmap顾名思义,就是位图也即Windows位图。它一般由4部分组成:文件头信真彩色模式无颜色表)和图像数据区组成。在系统中以BMP为扩展名保存。

打开Windows的画图程序,在保存图像时,可以看到三个选项:2色位图(黑白)、16色位图、256色位图和24位位图

现在讲解BMP的4个组成部分:

1.文件头信息块

0000-0001 :文件标识,为字母ASCII码“BM”。

0002-0005 :文件大小。

0006-0009 :保留,每字节以“00”填写。

000A-000D :记录图像数据区的起始位置。各字节的信息含义依次为:文件头信息块大小,图像描述信息块的大小,

2.图像描述信息块

000E-0011:图像描述信息块的大小,常为28H。

0012-0015:图像宽度。

0016-0019:图像高度。

001A-001B:图像的plane总数(恒为1)。

001C-001D:记录像素的位数,很重要的数值,图像的颜色数由该值决定。

001E-0021:数据压缩方式(数值位0:不压缩;1:8位压缩;2:4位压缩)。

0022-0025:图像区数据的大小。

0026-0029:水平每米有多少像素,在设备无关位图(.DIB)中,每字节以00H填写。

002A-002D:垂直每米有多少像素,在设备无关位图(.DIB)中,每字节以00H填写。

002E-0031:此图像所用的颜色数,如值为0,表示所有颜色一样重要。

3.颜色表

颜色表的大小根据所使用的颜色模式而定:2色图像为8字节;16色图像位64字节;256色图像为1024字节。其中,

G(绿色)、R(红色)、alpha(32位位图的透明度值,一般不需要)。即首先4字节表示颜色号0的颜色,接下来表示颜色

4.图像数据区

颜色表接下来位是位图文件的图像数据区,在此部分记录着每点像素对应的颜色号,其记录方式也随颜色模式而定,既

4位;256色图像每点占8位;真彩色图像每点占24位。所以,整个数据区的大小也会随之变化。究其规律而言,可的出如下宽度*图像高度*记录像素的位数)/8。然而,未压缩的图像信息区的大小。除了真彩色模式外,其余的均大于或等于数据信息的

1. BMP文件记录一行图像是以字节为单位的。因此,就不存在一个字节中的数据位信息表示的点在不同的两行中

个字节分配两个点信息时,如果图像的宽度位奇数,那么最后一个像素点的信息将独占一个字节,这个字节的后4位将没有意义行的信息。

2. 为了显示的方便,除了真彩色外,其他的每中颜色模式的行字节数要用数据“00”补齐为4的整数倍。如果显示模式每行则要补充4-(19/2+1)%4=2个字节(加1是因为里面有一个像素点要独占了一字节)。如果显示模式为256色,当图像宽为字节。

bmp文件大体上分成四个部分。

位图文件头BITMAPFILEHEADER 、位图信息头BITMAPINFOHEADER 、调色板Palette 、实际的位图数据ImageDa

第一部分为位图文件头BITMAPFILEHEADER,是一个结构,其定义如下:

typedef unsigned char BYTE

typedef unsigned short WORD

typedef unsigned long DWORD

typedef struct tagBITMAPFILEHEADER {

WORD bfType; //类型名,必须是0x424D,即字符串“BM”,

DWORD bfSize; //文件大小

WORD bfReserved1; //保留字,不考虑

WORD bfReserved2; //保留字,同上

DWORD bfOffBits; //实际位图数据的偏移字节数,即前三个部分长度之和

} BITMAPFILEHEADER;

第二部分为位图信息头BITMAPINFOHEADER,也是一个结构,其定义如下:

typedef struct tagBITMAPINFOHEADER{

DWORD biSize; //指定此结构体的长度,为40

LONG biWidth; //位图宽

LONG biHeight; //位图高

WORD biPlanes; //平面数,为1

WORD biBitCount //采用颜色位数,可以是1,2,4,8,16,24,新的可以是32

DWORD biCompression; //压缩方式,可以是0,1,2,其中0表示不压缩

DWORD biSizeImage; //实际位图数据占用的字节数

LONG biXPelsPerMeter; //X方向分辨率

LONG biYPelsPerMeter; //Y方向分辨率

DWORD biClrUsed; //使用的颜色数,如果为0,则表示默认值(2^颜色位数)

DWORD biClrImportant; //重要颜色数,如果为0,则表示所有颜色都是重要的

} BITMAPINFOHEADER;

第三部分为调色板Palette,当然,这里是对那些需要调色板的位图文件而言的。24位和32位是不需要调色板的。typedef struct tagRGBQUAD {

BYTE rgbBlue; //该颜色的蓝色分量

BYTE rgbGreen; //该颜色的绿色分量

BYTE rgbRed; //该颜色的红色分量

BYTE rgbReserved; //保留值

} RGBQUAD;

第四部分就是实际的图象数据了。对于用到调色板的位图,图象数据就是该象素颜在调色板中的索引值。对于真彩色图

于2色位图,用1位就可以表示该象素的颜色(一般0表示黑,1表示白),所以一个字节可以表示8个象素。对于16色位图,一个字节可以表示2个象素。对于256色位图,一个字节刚好可以表示1个象素。对于真彩色图,三个字节才能表示1个象素必须是4的整倍数,如果不是,则需要补齐。(2) 一般来说,.bMP文件的数据从下到上,从左到右的。也就是说,从文件中最一个象素,然后是左边第二个象素……接下来是倒数第二行左边第一个象素,左边第二个象素……依次类推,最后得到的是最

16色系统调色板:

0 = RGB( 0, 0, 0) = 0x00000000;

1 = RGB(128, 0, 0) = 0x00000080;

2 = RGB( 0,128, 0) = 0x00008000;

3 = RGB(128,128, 0) = 0x00008080;

4 = RGB( 0, 0,128) = 0x00800000;

5 = RGB(128, 0,128) = 0x00800080;

6 = RGB( 0,128,128) = 0x00808000;

7 = RGB(128,128,128) = 0x00808080;

8 = RGB(192,192,192) = 0x00c0c0c0;

9 = RGB(255, 0, 0) = 0x000000ff;

10 = RGB( 0,255, 0) = 0x0000ff00;

11 = RGB(255,255, 0) = 0x0000ffff;

12 = RGB( 0, 0,255) = 0x00ff0000;

13 = RGB(255, 0,255) = 0x00ff00ff;

14 = RGB( 0,255,255) = 0x00ffff00;

15 = RGB(255,255,255) = 0x00ffffff;

图像数据起始:000A-000D

图像数据大小:0022-0025

图像信息大小:000E-0011

图像宽度:0012-0015

图像高度:0016-0019

BMP文件详解

2007-03-27 20:00

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

典型的BMP图像文件由三部分组成:位图文件头数据结构,它包含BMP图像文件的类型、显示内容等信息;位图信息数据结构压缩方法,以及定义颜色等信息。

具体数据举例:

如某BMP文件开头:

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

BMP文件可分为四个部分:位图文件头、位图信息头、彩色板、图像数据阵列,在上图中已用*分隔。

一、图像文件头

1)1:图像文件头。424Dh="BM",表示是Windows支持的BMP格式。

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

3)4-5:保留,必须设置为0。

4)6-7:从文件开始到位图数据之间的偏移量。4600 0000,为00000046h=70,上面的文件头就是35字=70字节。

5)8-9:位图图信息头长度。

6)10-11:位图宽度,以像素为单位。8000 0000,为00000080h=128。

7)12-13:位图高度,以像素为单位。9000 0000,为00000090h=144。

8)14:位图的位面数,该值总是1。0100,为0001h=1。

二、位图信息头

9)15:每个像素的位数。有1(单色),4(16色),8(256色),16(64K色,高彩色),24(16M色,真彩色),32(

为0010h=16。

10)16-17:压缩说明:有0(不压缩),1(RLE 8,8位RLE压缩),2(RLE 4,4位RLE压缩,3(Bitfields,位域存放)。值的方式进行压缩。T408采用的是位域存放方式,用两个字节表示一个像素,位域分配为r5b6g5。图中0300 0000为000000 11)18-19:用字节数表示的位图数据的大小,该数必须是4的倍数,数值上等于位图宽度×位图高度×每个像素位数。0090 0000 12)20-21:用象素/米表示的水平分辨率。A00F 0000为0000 0FA0h=4000。

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

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

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

三、彩色板(非必有)

16)28-35:彩色板规范。对于调色板中的每个表项,用下述方法来描述RGB的值:

1字节用于蓝色分量

1字节用于绿色分量

1字节用于红色分量

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

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

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

00FB 0000为FB00h=1111100000000000(二进制),是红色分量的掩码。

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

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

0000 0000总设置为0。

将掩码跟像素值进行“与”运算再进行移位操作就可以得到各色分量值。看看掩码,就可以明白事实上在每个像素值的两个字节

分别就是r、g、b分量值。取出分量值后把r、g、b值分别乘以8、4、8就可以补齐第个分量为一个字节,再把这三个字节按序),就可以转换为24位标准BMP格式了。

四、图像数据阵列

17)17-...:每两个字节表示一个像素。阵列中的第一个字节表示位图左下角的象素,而最后一个字节表示位图右上角的象素

下面用UltraEdit打开C:\WINDOWS\Blue Lace 16.bmp察看其16进制数据。

一个bmp文件以BITMAPFILEHEADER结构体开始,BITMAPFILEHEADER的第1个属性是bfType(2字节),这里恒定等列高位在左,低位在右,所以内存中从左往右看就显示成(42 4D),所以在UltraEdit中头两个字节显示为(42 4D)就是这样形成再作重复说明。

BITMAPFILEHEADER的第2个属性是bfSize(4字节),表示整个bmp文件的大小,这里等于&H000004F8=1272字节。

BITMAPFILEHEADER的第3个、第4个属性分别是bfReserved1、bfReserved2(各2字节),这里是2个保留属性,都为

BITMAPFILEHEADER的第5个属性是bfOffBits(4字节),表示DIB数据区在bmp文件中的位置偏移量,这里等于&H0000始往后数的118字节开始。

BITMAPFILEHEADER结构体这里就讲完了,大家会发现BITMAPFILEHEADER只占了bmp文件开始的14字节长度,但需要BITMAPFILEHEADER结构体变量,其长度占了16个字节,原因就是第1个属性本来应该只分配2个字节,但实际被分配了

果想保存一张bmp图片,写入BITMAPFILEHEADER结构体时一定要注意这一点。

接下来是BITMAPINFO结构体部分。BITMAPINFO段由两部分组成:BITMAPINFOHEADER结构体和RGBQUAD结构

的颜色信息,有些时候可以省略,一般的24位图片和32位图片都不带RGBQUAD结构体,因为DIB数据区直接表示的RGB

有RGBQUAD结构体。(多少位的图片就是用多少位来表示一个颜色信息,例如4位图片表示用4个bit来表示一个颜色信息。

结构体,可以根据前面BITMAPFILEHEADER结构体的第5个属性bfOffBits来判断,因为BITMAPINFOHEADER结构体长度为结构体结束后还未到DIB数据区的偏移量,就说明接下来的数据是RGBQUAD结构体部分。这里讲的C:\WINDOWS\Blue Lace 带有RGBQUAD结构体。

下面进入正题BITMAPINFOHEADER部分。

BITMAPINFOHEADER的第1个属性是biSize(4字节),表示BITMAPINFOHEADER结构体的长度,最常见的长度是40字节个字节等于&H00000028=40字节。

BITMAPINFOHEADER的第2个属性是biWidth(4字节),表示bmp图片的宽度,这里等于&H00000030=48像素。

BITMAPINFOHEADER的第3个属性是biHeight(4字节),表示bmp图片的高度,这里等于&H00000030=48像素。

BITMAPINFOHEADER的第4个属性是biPlanes(2字节),表示bmp图片的平面属,显然显示器只有一个平面,所以恒等于BITMAPINFOHEADER的第5个属性是biBitCount(2字节),表示bmp图片的颜色位数,即24位图、32位图等等。这里等BITMAPINFOHEADER的第6个属性是biCompression(4字节),表示图片的压缩属性,bmp图片是不压缩的,等于0,

BITMAPINFOHEADER的第7个属性是biSizeImage(4字节),表示bmp图片数据区的大小,当上一个熟悉biCompression

所以这里等于&H00000000。

BITMAPINFOHEADER的第8个属性是biXPelsPerMeter(4字节),表示图片X轴每米多少像素,可省略,这里等于&H0000

BITMAPINFOHEADER的第9个属性是biYPelsPerMeter(4字节),表示图片Y轴每米多少像素,可省略,这里等于&H0000

BITMAPINFOHEADER的第10个属性是biClrUsed(4字节),表示使用了多少个颜色索引表,一般biBitCount属性小于16才会用个颜色索引表,所以这里仍等于&H00000000。

BITMAPINFOHEADER的第11个属性是biClrImportant(4字节),表示有多少个重要的颜色,等于0时表示所有颜色都很重至此BITMAPINFOHEADER结构体结束。

由于这个图片到这里还未到达DIB数据区的偏移量,所以接下来的部分是RGBQUAD结构体。RGBQUAD结构体由4个字节结构体只占用4字节空间,从左到右每个字节依次表示(蓝色,绿色,红色,未使用)。举例的这个图片我数了数总共有16个

位图,2^4正好等于16,所以它把16种颜色全部都枚举出来了,这些颜色就是一个颜色索引表。颜色索引表编号从0开始,

从UltraEdit中可以看到按照顺序,这16个RGBQUAD结构体依次为:

编号:(蓝,绿,红,空)

0号:(00,00,00,00)

1号:(00,00,80,00)

2号:(00,80,00,00)

3号:(00,80,80,00)

4号:(80,00,00,00)

5号:(80,00,80,00)

6号:(80,80,00,00)

7号:(80,80,80,00)

8号:(C0,C0,C0,00)

9号:(00,00,FF,00)

10号:(00,FF,00,00)

11号:(00,FF,FF,00)

12号:(FF,00,00,00)

13号:(FF,00,FF,00)

14号:(FF,FF,00,00)

15号:(FF,FF,FF,00)

为了更直观的表示这些颜色,可以见后面的图片。

到这里,正好满足DIB数据区的偏移量,所以后面的字节就是图片内容了。这里需要提醒的是所有的DIB数据扫描行是上制底部的像素,再绘制顶部的像素,所以这些DIB数据所表示的像素点就是从图片的左下角开始,一直表示到图片的右上角

由于这里的图片是4位图片,也就是说4bit就表示一个像素,一个字节有8个bit,所以一个字节能表示2个像素。

从UltraEdit中可以看到,DIB数据区第一个字节是&H44,16进制正好是将2进制数每4个一组书写的,跟4bit图片正好高位的4表示第一个像素,低位的4表示第二个像素。这里的4不是表示RGB颜色,而是表示颜色索引号为4,由于索引号从中第5个颜色,从附图中可以看到索引号为4的是蓝色。这是第一字节,表示的是图片左下角开始2个像素,如果有 PhotoSho 2个像素取出来的颜色RGB值正好等于索引表中第5个颜色的RGB值。后面的DIB数据以此类推。

至此一个bmp图片就全部解析完了,根据这些信息就可以完整的绘制一张bmp图片来。

bmp文件格式详解

b m p文件格式详解 Company Document number:WTUT-WT88Y-W8BBGB-BWYTT-19998

BMP文件格式,又称为Bitmap(位图)或是DIB(Device-IndependentDevice,设备无关位图),是Windows系统中广泛使用的图像文件格式。由于它可以不作任何变换地保存图像像素域的数据,因此成为我们取得RAW数据的重要来源。Windows的图形用户界面(graphicaluserinterfaces)也在它的内建图像子系统GDI中对BMP格式提供了支持。 下面以Notepad++为分析工具,结合Windows的位图数据结构对BMP文件格式进行一个深度的剖析。 BMP文件的数据按照从文件头开始的先后顺序分为四个部分: bmp文件头(bmpfileheader):提供文件的格式、大小等信息 位图信息头(bitmapinformation):提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息 调色板(colorpalette):可选,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表 位图数据(bitmapdata):就是图像数据啦^_^ 下面结合Windows结构体的定义,通过一个表来分析这四个部分。 我们一般见到的图像以24位图像为主,即R、G、B三种颜色各用8 个bit来表示,这样的图像我们称为真彩色,这种情况下是不需要调色 板的,也就是所位图信息头后面紧跟的就是位图数据了。因此,我们 常常见到有这样一种说法:位图文件从文件头开始偏移54个字节就是

位图数据了,这其实说的是24或32位图的情况。这也就解释了我们 按照这种程序写出来的程序为什么对某些位图文件没用了。 下面针对一幅特定的图像进行分析,来看看在位图文件中这四个数据 段的排布以及组成。 我们使用的图像显示如下: 这是一幅16位的位图文件,因此它是含有调色板的。 在拉出图像数据进行分析之前,我们首先进行几个约定: 1.在BMP文件中,如果一个数据需要用几个字节来表示的话,那么该数据的存放字节顺序为“低地址村存放低位数据,高地址存放高位数据”。如数据 0x1756在内存中的存储顺序为: 这种存储方式称为小端方式(littleendian),与之相反的是大端方式(bigendian)。对两者的使用情况有兴趣的可以深究一下,其中还是有学问的。 2.以下所有分析均以字节为序号单位进行。 下面我们对从文件中拉出来的数据进行剖析: 一、bmp文件头 Windows为bmp文件头定义了如下结构体: typedef struct tagBITMAPFILEHEADER {?

BMP格式结构详解

位图文件(B it m a p-File,BMP)格式是Windows采用的图像文件存储格式,在Windows环境下运行的所有图像处理软件都支持这种格式。Windows 3.0以前的BMP位图文件格式与显示设备有关,因此把它称为设备相关位图(d evice-d ependent b itmap,DDB)文件格式。Windows 3.0以后的BMP位图文件格式与显示设备无关,因此把这种BMP位图文件格式称为设备无关位图(d evice-i ndependent b itmap,DIB)格式,目的是为了让Windows能够在任何类型的显示设备上显示BMP位图文件。BMP位图文件默认的文件扩展名是BMP或者bmp。 6.1.2 文件结构 位图文件可看成由4个部分组成:位图文件头(bitmap-file header)、位图信息头(bitmap-information header)、彩色表(color table)和定义位图的字节阵列,它们的名称和符号如表6-01所示。 表6-01 BMP图像文件组成部分的名称和符号 位图文件的组成结构名称符号 位图文件头(bitmap-file header)BITMAPFILEHEADE R bmfh 位图信息头(bitmap-information header)BITMAPINFOHEADE R bmih 彩色表(color table)RGBQUAD aColors[] 图像数据阵列字节BYTE aBitmapBits[ ] 位图文件结构可综合在表6-02中。 表6-02 位图文件结构内容摘要 偏移量域的名称大小内容 图像文件头0000h标识符 (Identifie r) 2 bytes两字节的内容用来识别位图的类型: ‘BM’ : Windows 3.1x, 95, NT, linux ‘BA’ :OS/2 Bitmap Array ‘CI’ :OS/2 Color Icon ‘CP’ :OS/2 Color Pointer ‘IC’ : OS/2 Icon ‘PT’ :OS/2 Pointer 0002h File Size 1 dword用字节表示的整个文件的大小 0006h Reserved 1 dword保留,设置为0 000Ah Bitmap Data Offset 1 dword从文件开始到位图数据开始之间的数据(bitmap data)之间的偏移量 000Eh Bitmap Header Size 1 dword位图信息头(Bitmap Info Header)的长度,用来 描述位图的颜色、压缩方法等。下面的长度表示: 28h - Windows 3.1x, 95, NT, … 0Ch - OS/2 1.x F0h - OS/2 2.x 0012h Width 1 dword位图的宽度,以像素为单位 0016h Height 1 dword位图的高度,以像素为单位 001Ah Planes 1 word位图的位面数 图像001Ch Bits Per Pixel 1 word每个像素的位数 1 - Monochrome bitmap

C语言 BMP图片处理

C语言BMP图片处理 BMP是bitmap的缩写形式,bitmap顾名思义,就是位图也即Windows位图。它一般由4部分组成:文件头信息块、图像描述信息块、颜色表(在真彩色模式无颜色表)和图像数据区组成。在系统中以BMP为扩展名保存。 打开Windows的画图程序,在保存图像时,可以看到三个选项:2色位图(黑白)、16色位图、256色位图和24位位图。这是最普通的生成位图的工具,在这里讲解的BMP位图形式,主要就是指用画图生成的位图(当然,也可以用其它工具软件生成)。 现在讲解BMP的4个组成部分: 1.文件头信息块 0000-0001:文件标识,为字母ASCII码“BM”。 0002-0005:文件大小。 0006-0009:保留,每字节以“00”填写。 000A-000D:记录图像数据区的起始位置。各字节的信息依次含义为:文件头信息块大小,图像描述信息块的大小,图像颜色表的大小,保留(为01)。 2.图像描述信息块 000E-0011:图像描述信息块的大小,常为28H。 0012-0015:图像宽度。 0016-0019:图像高度。 001A-001B:图像的plane(平面?)总数(恒为1)。 001C-001D:记录像素的位数,很重要的数值,图像的颜色数由该值决定。001E-0021:数据压缩方式(数值位0:不压缩;1:8位压缩;2:4位压缩)。0022-0025:图像区数据的大小。 0026-0029:水平每米有多少像素,在设备无关位图(.DIB)中,每字节以00H 填写。 002A-002D:垂直每米有多少像素,在设备无关位图(.DIB)中,每字节以00H 填写。 002E-0031:此图像所用的颜色数,如值为0,表示所有颜色一样重要。 3.颜色表 颜色表的大小根据所使用的颜色模式而定:2色图像为8字节;16色图像位64字节;256色图像为1024字节。其中,每4字节表示一种颜色,并以B(蓝色)、G(绿色)、R(红色)、alpha(像素的透明度值,一般不需要)。即首先4字节表示颜色号0的颜色,接下来表示颜色号1的颜色,依此类推。 4.图像数据区

24位BMP图像

#include #include void main() { FILE *fpIn,*fpOut; /////////////////////////// struct RGBQUAD { unsigned char rgbBlue; unsigned char rgbGreen; unsigned char rgbRed; unsigned char rgbReserved; } bicolor; char bfty[2]; short bfreserved1,biplanes,bibitcount; long bfsize,bfoffbit,bisize,biwidth,biheight; long bicompression,bisizeimage,bix,biy,biclrused,biclrimportant; char *cR; int iCol,iRow; int i,j; int iWidth; char *lpsData; int iL; short sTemp; //////////////////////////////////// fpIn=fopen("F:/课堂学习/遥感数字图像处理/data/AA","rb"); fpOut=fopen("F:/课堂学习/遥感数字图像处理/data/Tm23.bmp","wb"); //D:\??\??????????\Data\data iCol=600; iRow=600; bfty[0]='B'; bfty[1]='M'; bfsize=54+iCol*iRow*3; bfreserved1=0; bfoffbit=54; ///////////////// bisize=40; biwidth=iCol; biheight=iRow; biplanes=1; bibitcount=24; bicompression=0;

BMP图片解码

BMP图片解码 //************************************************************************** ***// //* 数码相框 //*控制芯片:ATmgea128 //*开发环境:AVR Studio+GCC //*隶属模块:位图解码 //*设计者:桃子 //************************************************************************** ***// #include "bmp.h" extern unsigned char buffer[512]; //文件系统数据缓冲 extern FATFS fs; //文件系统结构 extern FIL fl; //文件状态信息 extern FRESULT res; //文件返回值 extern unsigned int r; //文件读取数量 //**************************************************************** //*隶属模块:BMP解码 //*函数功能:小端转大端 //**************************************************************** UINT32 bmp_LE2BE(UINT8 *dat,UINT8 len) { UINT32 temp=0; if(len>= 1) temp = (UINT32)dat[0]; if(len>= 2) temp |= (UINT32)dat[1]<<8; if(len>= 3) temp |= (UINT32)dat[2]<<16; if(len>= 4) temp |= (UINT32)dat[3]<<24; return temp; } //**************************************************************** //*隶属模块:BMP解码 //*函数功能:单灰BMP解码显示 //*注意:图片宽度最好小于208 //**************************************************************** void BMP_1(unsigned int x0,unsigned int y0,unsigned char type) { unsigned int j; unsigned char k=0;

位图结构详细资料

GDI基本概念及思想 编写代码的一般步骤:先用CreateDC创建(或GetDC获取)device content(DC),然后用GetObject获取(或使用创建object的函数创建)需要的object,并用SelectObject将获取的object选入device content(DC),再使用object进行相应的画图操作,最后用SelectObject将原来的object重新选入DC,并delete 或release删除或释放前面创建或获取的DC。 1.关于device context (DC)设备内容:用来显示位图的地方. 四种设备内容:显示器设备内容、打印机设备内容、内存设备内容、Information 设备内容,常用的有显示器DC和内存DC. Device Context Types: There are four types of DCs: display, printer, memory (or compatible), and information. Device context Description Display Supports drawing operations on a video display. Printer Supports drawing operations on a printer or plotter. Memory Supports drawing operations on a bitmap. Information Supports the retrieval of device data. 其中需要注意的一种类型是:Memory Device Contexts,将在bitmap处理中详细介绍。 创建和获取DC的相关函数: CreateDC,CreateCompatibleDC,GetDC,GetCurrentDC. 其中CreateCompatibleDC用于创建内存设备内容. 刷新、释放和删除DC的相关函数: ResetDC,ReleaseDC,DeleteDC.前者当DC有变动时用来重置DC,后者用来释放使用万完的DC. DeleteDC与CreateDC对应使用 ReleaseDC与GetDC对应使用 2.关于graphical object(GDI objects): 包括:pen,brush,bitmap,palette,region,path. 获取、选择和删除object的相关函数:

BMP图像格式详解

BMP格式图像文件详析 首先请注意所有的数值在存储上都是按“高位放高位、低位放低位的原则”,如12345678h放在存储器中就是7856 3412)。下图是导出来的开机动画的第一张图加上文件头后的16进制数据,以此为例进行分析。T408中的图像有点怪,图像是在电脑上看是垂直翻转的。在分析中为了简化叙述,以一个字(两个字节为单位,如424D就是一个字)为序号单位进行,“h”表示是16进制数。 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 0000 E007 0000 1F00 0000 0000 0000*02F1 84F1 04F1 84F1 84F1 06F2 84F1 06F2 04F2 86F2 06F2 86F2 86F2 ...... BMP文件可分为四个部分:位图文件头、位图信息头、彩色板、图像数据阵列,在上图中已用*分隔。 一、图像文件头 1)1:图像文件头。424Dh=’BM’,表示是Windows支持的BMP 格式。

2)2-3:整个文件大小。4690 0000,为00009046h=36934。 3)4-5:保留,必须设置为0。 4)6-7:从文件开始到位图数据之间的偏移量。4600 0000,为00000046h=70,上面的文件头就是35字=70字节。 5)8-9:位图图信息头长度。 6)10-11:位图宽度,以像素为单位。8000 0000,为00000080h=128。 7)12-13:位图高度,以像素为单位。9000 0000,为00000090h=144。 8)14:位图的位面数,该值总是1。0100,为0001h=1。 二、位图信息头 9)15:每个像素的位数。有1(单色),4(16色),8(256色),16(64K色,高彩色),24(16M色,真彩色),32(4096M色,增强

位图文件结构

位图文件结构 1.位图文件头(BITMAPFILEHEADER):14字节 typedef struct tagBITMAPGILEHEADER{ WORD bfType; //值为0x4d42 DWORD bfSize; //位图文件的大小 WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; } BITMATPFILEHEADER; 2.位图信息: typedef struct tagBITMAPINFO{ BITMAPINFOHEADER bmiHeader; //位图信息头 RGBQUAD bmiColors; //颜色表 } BITMAPINFO; 1)位图信息头: typedef struct tagBITMAPINFOHEADER{ DWORD biSize; //位图信息头的字节数sizeof(BITMAPINFOHEADER) LONG biWidth; //以像素为单位的图像宽度 LONG biHeight; //以像素为单位的图像长度 WORD biPlanes; //目标设备的位平面数 WORD biBitCount; //每个像素的位数【1】 DWORD biCompression; //图像的压缩格式(这个值几乎总是为0) DWORD biSizeImage; //以字节为单位的图像数据的大小 LONG biXpelsPerMeter; //水平方向上的每米的像素个数 LONG biYpelsPerMeter; //垂直方向上的每米的像素个数 DWORD biClrUsed; //调色板中实际使用的颜色数,通常为0 DWORD biClrImportant; //实现位图时必须的颜色数,通常为0 } BITMAPINFOHEADER; 【1】每个像素的位数 0,用在JPEG格式中 1,单色图,调色板中含有两种颜色,也就是我们通常说的黑白图片 4,16色图 8,256色图,通常说的灰度图 16,64K图,一般没有调色板,图像数据中每两个字节表示一个图像,5个或6个位表示一个RGB分量 24,16M真彩色图,一般没有调色板,图像数据中每3个字节表示一个像素,每个字节表示一个RGB分量 32,4G真彩色,一般没有调色板,每4个字节表示一个像素,相对24位真彩图而言,加入了一个透明度,即RGBA模式 2)颜色表: 针对16位以下的图像而设置的。对于16位以下的图像,由于其位图像素数据中记 录的只是调色板索引值,因而需要根据这个索引到调色板去取得相应的RGB颜色。 typedef struct tagRGBQUAD{ BYTE rgbBlue;

bmp图像的读取

BMP图像文件由三部分组成:位图文件头数据结构,它包含BMP图像文件的类型、显示内容等信息;位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息。 位图文件主要分为如下3个部分: 1、文件信息头BITMAPFILEHEADER 结构体定义如下: typedef struct tagBITMAPFILEHEADER { WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; } BITMAPFILEHEADER; 其中: 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; 其中:

BMP头文件格式以及C语言读取头文件(二) 具体数据举例: 如某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 0000 E007 0000 1F00 0000 0000 0000*02F1 84F1 04F1 84F1 84F1 06F2 84F1 06F2 04F2 86F2 06F2 86F2 86F2 .... .... BMP文件可分为四个部分:位图文件头、位图信息头、彩色板、图像数据阵列,在上图中已用*分隔。 一、图像文件头 1)1:(这里的数字代表的是"字",即两个字节,下同)图像文件头。424Dh=’BM’,表示是Windows支持的BMP格式。 2)2-3:整个文件大小。4690 0000,为00009046h=36934。 3)4-5:保留,必须设置为0。 4)6-7:从文件开始到位图数据之间的偏移量。4600 0000,为00000046h=70,上面的文件头就是35字=70字节。 5)8-9:位图图信息头长度。 6)10-11:位图宽度,以像素为单位。8000 0000,为00000080h=128。 7)12-13:位图高度,以像素为单位。9000 0000,为00000090h=144。 8)14:位图的位面数,该值总是1。0100,为0001h=1。 二、位图信息头 9)15:每个像素的位数。有1(单色),4(16色),8(256色),16(64K 色,高彩色),24(16M色,真彩色),32(4096M色,增强型真彩色)。1000为0010h=16。 10)16-17:压缩说明:有0(不压缩),1(RLE 8,8位RLE压缩),2(RLE 4,4位RLE压缩,3(Bitfields,位域存放)。RLE简单地说是采用像素数+像素值的方式进行压缩。T408采用的是位域存放方式,用两个字节表示一个像素,位域分配为r5b6g5。图中0300 0000为00000003h=3。 11)18-19:用字节数表示的位图数据的大小,该数必须是4的倍数,数值上等于位图宽度×位图高度×每个像素位数。0090 0000为 00009000h=80×90×2h=36864。

BMP文件格式

BMP文件格式 简介 BMP(Bitmap-File)图形文件是Windows采用的图形文件格式,在Windows环境下运行的所有图象处理软件都支持BMP图象文件格式。Wi ndows系统内部各图像绘制操作都是以BMP为基础的。Windows 3.0以前的BMP图文件格式与显示设备有关,因此把这种BMP图象文件格式称为设备相关位图DDB(device-dependent bitmap)文件格式。Windows 3.0以后的BMP图象文件与显示设备无关,因此把这种BM P图象文件格式称为设备无关位图DIB(device-independent bitmap)格式(注:Windows 3.0以后,在系统中仍然存在DDB位图,象BitBl t()这种函数就是基于DDB位图的,只不过如果你想将图像以BMP格式保存到磁盘文件中时,微软极力推荐你以DIB格式保存),目的是为了让Windows能够在任何类型的显示设备上显示所存储的图象。BMP位图文件默认的文件扩展名是BMP或者bmp(有时它也会以.DIB 或.RLE作扩展名)。 此图用WinHex软件打开后结果如下:(在介绍完bmp文件格式后会具体分析这些数字,最后也有matlab对此图的分析)注:此图是24位真彩色图。 文件结构 位图文件可看成由4个部分组成:位图文件头(bitmap-file header)、位图信息头(bitmap-information header)、彩色表(color table)和定义位图的字节阵列,它具有如下所示的形式。

位图文件结构可综合在表6-01中。表01 位图文件结构内容摘要

构件详解 1. 位图文件头 位图文件头包含有关于文件类型、文件大小、存放位置等信息,在Windows 3.0以上版本的位图文件中用BITMAPFILEHEADER结构来定义: typedef struct tagBITMAPFILEHEADER { /* bmfh */ UINT bfType; DWORD bfSize; UINT bfReserved1; UINT bfReserved2; DWORD bfOffBits; } BITMAPFILEHEADER; 其中: bfType 说明文件的类型.(该值必需是0x4D42,也就是字符'BM'。我们不需要判断OS/2的位图标识,这么做现在来看似乎已经没有什么意义了,而且如果要支持OS/2的位图,程序将变得很繁琐。所以,在此只建议你检察'BM'标识) bfSize 说明文件的大小,用字节为单位bfReserved1 保留,必须设置为0

BMP头文件格式

bmp头文件格式 1:BMP文件组成 BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。2:BMP文件头(14字节) BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。 其结构定义如下: typedef struct tagBITMAPFILEHEADER { WORDbf Type; // 位图文件的类型,必须为BMP(0-1字节) DWORD bfSize; // 位图文件的大小,以字节为单位(2-5字节) WORD bfReserved1; // 位图文件保留字,必须为0(6-7字节) WORD bfReserved2; // 位图文件保留字,必须为0(8-9字节) DWORD bfOffBits; // 位图数据的起始位置,以相对于位图(10-13字节) // 文件头的偏移量表示,以字节为单位 } BITMAPFILEHEADER; 3:位图信息头(40字节) BMP位图信息头数据用于说明位图的尺寸等信息。 typedef struct tagBITMAPINFOHEADER{ DWORD biSize; // 本结构所占用字节数(14-17字节) LONG biWidth; // 位图的宽度,以像素为单位(18-21字节)

LONG biHeight; // 位图的高度,以像素为单位(22-25字节) WORD biPlanes; // 目标设备的级别,必须为1(26-27字节) WORD biBitCount;// 每个像素所需的位数,必须是1(双色),(28-29字节) // 4(16色),8(256色)或24(真彩色)之一 DWORD biCompression; // 位图压缩类型,必须是0(不压缩),(30-33字节) // 1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一 DWORD biSizeImage; // 位图的大小,以字节为单位(34-37字节) LONG biXPelsPerMeter; // 位图水平分辨率,每米像素数(38-41字节) LONG biYPelsPerMeter; // 位图垂直分辨率,每米像素数(42-45字节) DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数(46-49字节) DWORD biClrImportant;// 位图显示过程中重要的颜色数(50-53字节) } BITMAPINFOHEADER; 4:颜色表 颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。RGBQUAD结构的定义如下: typedef struct tagRGBQUAD {

BMP图像的读写(8位和24位)

南通大学计算机科学与技术学院 《数字图像处理》课程实验 报告书 实验名 BMP文件的读写(8位和24位) 班级计 121 姓名张进 学号 1213022016 2014年6月 16 日

一、实验内容 1、了解BMP文件的结构 2、8位位图和24位位图的读取 二、BMP图形文件简介 BMP(Bitmap-File)图形文件是Windows采用的图形文件格式,在Windows环境下运行的所有图象处理软件都支持BMP图象文件格式。Windows系统内部各图像绘制操作都是以BMP为基础的。Windows 3.0以前的BMP图文件格式与显示设备有关,因此把这种BMP 图象文件格式称为设备相关位图DDB(device-dependent bitmap)文件格式。Windows 3.0以后的BMP图象文件与显示设备无关,因此把这种BMP图象文件格式称为设备无关位图DIB(device-independent bitmap)格式(注:Windows 3.0以后,在系统中仍然存在DDB位图,象BitBlt()这种函数就是基于DDB位图的,只不过如果你想将图像以BMP格式保存到磁盘文件中时,微软极力推荐你以DIB格式保存),目的是为了让Windows能够在任何类型的显示设备上显示所存储的图象。BMP位图文件默认的文件扩展名是BMP或者bmp(有时它也会以.DIB或.RLE作扩展名)。 位图文件可看成由4个部分组成:位图文件头(bitmap-file header)、位图信息头(bitmap-information header)、彩色表(color table)和定义位图的字节阵列,它具有如下所示的形式。 位图文件结构内容摘要

BMP图像格式分析

BMP图像格式分析 BMP图像文件格式是微软公司为其Windows环境设置的标准图像格式,而且 Windows系统软件中还同时内含了一系列支持BMP图像处理的API函数,随着Windows 在世界范围内的不断普及,BMP文件格式无疑也已经成为PC机上的流行图像文件格式。它的主要特点可以概括为:文件结构与PCX文件格式类似,每个文件只能存放一幅图像;图像数据是否采用压缩方式存放,取决于文件的大小与格式,即压缩处理成为图像文件的一个选项,用户可以根据需要进行选择。其中,非压缩格式是BMP图像文件所采用的一种通用格式。但是,如果用户确定将BMP文件格式压缩处理,则Windows设计了两种压缩方式:如果图像为16色模式,则采用RLE4压缩方式,若图像为256色模式,则采用RLE8压缩方式。同时,BMP 图像文件格式可以存储单色、16色、256色以及真彩色四种图像数据,,其数据的排列顺序与一般文件不同,它以图像的左下角为起点存储图像,而不是以图像的左上角为起点;而且BMP图像文件格式中还存在另外一个与众不同的特点,即其调色板数据所采用的数据结构中,红、绿、蓝三种基色数据的排列顺序也恰好与其它图像文件格式相反。总之,BMP图像文件格式拥有许多适合于Windows环境的新特色,而且随着Windows版本的不断更新,微软公司也在不断改进其BMP 图像文件格式,例如:当前BMP图像文件版本中允许采用32位颜色表,而且针对32位Windows 的产生,相应的API 函数也在不断地报陈出新,这些无疑都同时促成了BMP文件格式的不断风靡。但由于BMP文件格式只适合于Windows上的应用软件,而对于DOS环境中的各种应用软件则无法提供相应的支持手段,因此这无疑是阻碍BMP文件格式的流通程度超过PCX文件格式的一个重要因素。 Windows中定义了两种位图文件类型,即一般位图文件格式与设备无关位图文件格式。其中,由于设备无关位图(DIB)文件格式具有更强的灵活性与完整的图像数据、压缩方式等定义。BMP图像文件的结构可以分为如下三个部分:文件头、调色板数据以及图像数据。其中文件头的长度为固定值54个字节;调色板数据对所有不超过256色的图像模式都需要进行设置,即使是单色图像模式也不例外,但是对于真彩色图像模式,其对应的BMP文件结构中却不存在相应调色板数据的设置信息;图像数据既可以采用一定的压缩算法进行处理,也可以不必对图像数据进行压缩处理,这不仅与图像文件的大小相关,而且也与对应的图像处理软件是否支持经过压缩处理的BMP图像文件相关。以下将分别介绍BMP图像文件结构中的这三个重要组成部分。特别值得注意的是:BMP 图像文件结构设计得相当简单,这无疑有利于图像文件的处理速度,但是同时也使得 BMP图像文件格式具有一定的局限性,即一个BMP图像文件只能存储一幅图像。 BMP图像文件的文件头定义 Windows中将BMP图像文件的文件头分成两个数据结构,其中一个数据结构中包含BMP文件的类型、大小和打印格式等信息,称为BITMAPFILEHEADERl另外一个数据结构中则包含BMP文件的尺寸定义等信息,称为BITMAPINFOHEADERl 如果图像文件还需要调色板数据,则将其存放在文件头信息之后。 BITMAPFIlEHEADER数据结构在Windows.h中的定义为: typedef struCttagBITMAPFIlEHEADER { WORD bftype; DWORD bfsiZe: WORD bfReservedl; WORD bgReserved2: DWORD bfoffBits: }BITMAPFILEHEADER; 其中,bfrype在图像文件存储空间中的数据地址为0,数据类型为unsignedchar,内容为固定值“BM”,用于标志文件格式,表示该图像文件为BMP文件。 bfsize的数据地址为2,类型为unsignedlong,它以字节为单位,定义位图文件的大小。 bfReservedl与bfReserved2的数据地址分别为6和8,数据类型则都为unsignedint,二者都是BMP文件的保留字,没有任何意义,其值必须为0. bfoffBits的数据地址为10,数据类型为unsignedlong,它以字节为单位,指示图像数据在文件内的起始地址,即图像数

bmpTesth介绍BMP文件的格式及结构定义

bmpTest.h : 介绍BMP 文件的格式及结构定义 bmpTest.cpp : 24bitBMP 颜色数据到256 色位图颜色数据的转换函数实现,具体算法可参考以前的一个帖子bmpTransfer.cpp : 读入一个24bitBMP 文件,转换成一个256 色BMP 文件的程序 编译完成后得到的程序,如bmpTransfer.exe 执行bmpTransfer file1 file2 file1 是24bit 的BMP 位图源文件名,file2 是新生成的256 色位图文件名 可以用windows 画板程序查看结果,似乎比直接用画板程序将24bitBMP 存成256 色BMP 文件的转换效果要好哦。 /************* bmpTest.h **************/ #ifndef __BMPTEST_H_ #define __BMPTEST_H #include typedef unsigned char BYTE; typedef unsigned short WORD; // BMP 图像各部分说明如下 /*********** 第一部分位图文件头 该结构的长度是固定的,为14 个字节,各个域的依次如下: 2byte :文件类型,必须是0x4d42 ,即字符串"BM" 。 4byte :整个文件大小 4byte :保留字,为0 4byte :从文件头到实际的位图图像数据的偏移字节数。*************/ typedef struct { long imageSize; long blank; long startPosition; void show(void) { printf("BMP Head:\n"); printf("Image Size:%d\n",imageSize); printf("Image Data Start Position : %d\n",startPosition); } }BmpHead; /********************* 第二部分位图信息头该结构的长度也是固定的,为40 个字节,各个域的依次说明如下: 4byte :本结构的长度,值为40

Bmp图像存储格式

摘要:本文简单介绍了位图文件的两种存储格式,并且在VC++6.0下实现了读取位图文件中的数据,用SetPixel()函数在窗口中重现图像,最后在 程序中实现了一种存储格式到另一种存储格式的转换。 关键字:BMP、灰度位图、24位真彩色位图、存储格式 一、前言 BMP(Bitmap的缩写)图像是指文件名后缀为BMP的位图图像。位图图像在计算机中使用很广泛,例如在windows中,记事本、写字板中的文字就是用位图图像表示出来的。许多以其它格式存储的图像,就是在位图图像的基础上,进行优化处理后得到的,例如JPEG图像等。 在数字图像处理中,许多算法就是针对24位真彩色位图或灰度位图设计的。因此,很有必要介绍一下位图文件的这两种存储格式。 二、24位真彩色图像存储格式 把下图的24位真彩色图像格式在16位编辑器(例如VC编辑器)中打开,可以看到图像的二进制数据。 24位真彩色的二进制数据为: 这是24位真彩色位图文件数据一部分。这一部分数据包括位图文件头、位图信息头和位图阵列三部分。 (一)位图文件头 位图文件头用来记录标志文件大小的一些信息,在文件中占14个字节,存储的内容如下: 字节 1 2 3 4 5 6 7 8 9 10 11 12 13 14 000000 42 4D CC B4 02 00 00 00 00 00 36 00 00 00 其中: 42 4D 为位图的标志,即ASCII码为BM CC B4 02 表示位图文件的总字节数,换算成十进制为 (02B4CC)H=(177356)10,即这副图像的大小为177356字节。 00 00 00 00 00 为保留字节,用来存储文件大小的数据。 36 00 00 00 00 表示位图阵列的起始位置,(36)H=(54)10即54字节开始为位 图阵列。 (二) 位图信息头 位图信息头记录和位图相关的一些信息,在文件中占40个字节,存储的内容如下: 字节 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 00000 0 2 8 00001 6 0 2 C 1 C 5 1 1 8 00003 2 0 1 2 B 1 2 B 00004 8 0 其中:

bmp文件结构的探索 (1)

BMP文件结构的探索 BMP文件结构的探索 WhatIf 2004-9-10 一、文件格式 Bmp文件是非常常用的位图文件,无论是游戏还是其他都被广泛使用。针对bmp文件的处理也有一堆现成的api进行调用,然而文件内部究竟怎样,如何自己来解析这样的文件呢?为了消除无聊,我用了几天时间来研究了一下,同时作为学习笔记,进行记录。 首先,整个bmp文件的内容可以分为3到4块。之所以分为3到4块而不是固定的值,是因为,对于bmp来说可能存在调色板或者一些掩码。具体稍候讨论。 第一块是bmp的文件头用于描述整个bmp文件的情况。结构如下:typedef struct BITMAPFILEHEADER { WORD bfType; //两个字节 DWORD bfSize; //四个字节 WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; } BITMAPFILEHEADER, *PBITMAPFILEHEADER; 这些信息相当有用,如果你想直接来解析bmp文件。第一个bfType用于表示文件类型,如果它是bmp文件,那么它这个位置的值一定是”BM”也就是0x4D42。第二个bfSize表示整个文件的字节

数。第三第四个则保留,目前无意义,最后一个相当重要,表示,位图的数据信息离文件头的偏移量,以字节为单位。 第二块是位图信息头,即BITMAPINFOHEADER,用于描述整个位图文件的情况。以下挑重要的数据进行解释 typedef struct BITMAPINFOHEADER{ DWORD biSize; //表示本结构的大小 LONG biWidth; //位图的宽度 LONG biHeight; //位图的高度 WORD biPlanes; //永远为1 ,由于没有用过所以没做研究附msdn解释 //Specifies the number of planes for the target device. This value must be set to 1. WORD biBitCount;//位图的位数分为1 4 8 16 24 32 本文没对1 4 进行研究 DWORD biCompression; //本以为压缩类型,但是却另外有作用,稍候解释 DWORD biSizeImage; //表示位图数据区域的大小以字节为单位 LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant;

位图文件

一、位图文件结构 位图文件由三部分组成:文件头+ 位图信息+ 位图像素数据 1、位图文件头。位图文件头主要用于识别位图文件。以下是位图文件头结构的定义:[cpp]view plaincopyprint? 1.typedef struct tagBITMAPFILEHEADER { // bmfh 2.WORD bfType; 3.DWORD bfSize; 4.WORD bfReserved1; 5.WORD bfReserved2; 6.DWORD bfOffBits; 7.} BITMAPFILEHEADER; 1.typedef struct tagBITMAPINFO { 2.BITMAPINFOHEADER bmiHeader; 3.RGBQUAD bmiColors[1]; 4.} BITMAPINFO;

[cpp]view plaincopyprint? 1.typedef struct tagBITMAPINFOHEADER{ // bmih 2.DWORD biSize; 3.LONG biWidth; 4.LONG biHeight; 5.WORD biPlanes; 6.WORD biBitCount 7.DWORD biCompression; 8.DWORD biSizeImage; 9.LONG biXPelsPerMeter; 10.LONG biYPelsPerMeter; 11.DWORD biClrUsed; 12.DWORD biClrImportant; 13.} BITMAPINFOHEADER;

每个像素的位数*(1) biCompression 图像的压缩格式(这个值几乎总是为0) biSizeImage 以字节为单位的图像数据的大小(对BI_RGB压缩方式而言) biXPelsPermeter 水平方向上的每米的像素个数 biYpelsPerMeter 垂直方向上的每米的像素个数 biClrused 调色板中实际使用的颜色数(2) biClrImportant 现实位图时必须的颜色数(3) 说明:*是需要加以注意的部分,因为它们是我们在进行位图操作时经常参考的变量 (1)对于每个像素的字节数,分别有一下意义: 0,用在JPEG格式中 1,单色图,调色板中含有两种颜色,也就是我们通常说的黑白图片 4,16色图 8,256色图,通常说的灰度图 16,64K图,一般没有调色板,图像数据中每两个字节表示一个像素,5个或6个位表示一个RGB分量 24,16M真彩色图,一般没有调色板,图像数据中每3个字节表示一个像素,每个字节表示一个RGB分量 32,4G真彩色,一般没有调色板,每4个字节表示一个像素,相对24位真彩图而言,加入了一个透明度,即RGBA模式 (2)这个值通常为0,表示使用biBitCount确定的全部颜色,例外是使用的颜色数目小于制定的颜色深度的颜色数目的最大值。 (3)这个值通常为0,表示所有的颜色都是必需的 2.2颜色表。颜色表一般是针对16位一下的图像而设置的,对于16位和16位以上的图像,由于其位图像素数据中直接对对应像素的RGB(A)颜色进行描述,因而省却了调色板。而对于16位一下的 图像,由于其位图像素数据中记录的只是调色板索引值,因而需要根据这个索引到调色板去取得相应的RGB(A)颜色。颜色表的作用就是创建调色板。 下图是带调色板和不带调色板的位图的简单示意图 图1 带调色板和不带调色板位图之间的区别

相关文档
最新文档