当前位置:文档之家› bmp位图结构详解

bmp位图结构详解

bmp位图结构详解
bmp位图结构详解

要辨认图像中的字符,起首要会处理惩罚图像,把图像的信息读出来。这就必须先懂得图像的布局,存储体式格式。清华大学出版的一本《数字图像处理惩罚编程入门》给了我不少帮助。第一章的Windows位图和调色板让我对bmp图像有了根蒂根基懂得。对于彩色图,可以用RGB模型来默示。根蒂根基上所有色彩都可以用这三种色彩的组合来形成。但实际上也有一些差别,小于24位图都哄骗到了调色板,也就是一张R、G、B表,主如果为了节俭存储空间。bmp文件布局如下:

图一bmp位图布局示意图

第一项目组为位图文件头BITMAPFILEHEADER,是一个布局,其定义如下:typedef struct tagBITMAPFILEHEADER {

WORD bfType;

DWORD bfSize;

WORD bfReserved1;

WORD bfReserved2;

DWORD bfOffBits;

} BITMAPFILEHEADER;

这个布局的长度是固定的,为14个字节(WORD为无符号16位整数,DWORD为无符号32位整数),各个域的申明如下:

bfType

指定文件类型,必须是0 x4D42,即字符串“BM”,也就是说所有.bmp文件的头两个字节都是“BM”。

bfSize

指定文件大小,包含这14个字节。

bfReserved1,bfReserved2

为保存字,不消推敲

bfOffBits

为从文件头到实际的位图数据的偏移字节数,即图1.3中前三个项目组的长度之和。

第二项目组为位图信息头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;

这个布局的长度是固定的,为40个字节(LONG为32位整数),各个域的申明如下:

biSize

指定这个布局的长度,为40。

biWidth

指定图象的宽度,单位是象素。

biHeight

指定图象的高度,单位是象素。

biPlanes

必须是1,不消推敲。

biBitCount

指定默示色彩时要用到的位数,常用的值为1(曲直短长二色图),4(16色图),8(256色),24(真彩色图)(新的.bmp格局支撑32位色,这里就不做评论辩论了)。

biCompression

指定位图是否紧缩,有效的值为BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS(都是一些Windows定义好的常量)。要申明的是,Windows位图可以采取RLE4,和RLE8的紧缩格局,但用的不久不多。我们往后所评论辩论的只有第一种不紧缩的景象,即biCompression为BI_RGB的景象。

biSizeImage

指定实际的位图数据占用的字节数,其实也可以从以下的公式中策画出来:

biSizeImage=biWidth’ × biHeight

要重视的是:上述公式中的biWidth’必须是4的整倍数(所以不是biWidth,而是biWidth’,默示大于或便是biWidth的,最接近4的整倍数。举个例子,若是biWidth=240,则biWidth’=240;若是biWidth=241,biWidth’=244)。

若是biCompression为BI_RGB,则该项可能为零

biXPelsPerMeter

指定目标设备的程度辨别率,单位是每米的象素个数,关于辨别率的概念,我们将在第4

章具体介绍。

biYPelsPerMeter

指定目标设备的垂直辨别率,单位同上。

biClrUsed

指定本图象实际用到的色彩数,若是该值为零,则用到的色彩数为2biBitCount。

biClrImportant

指定本图象中首要的色彩数,若是该值为零,则认为所有的色彩都是首要的。

第三项目组为调色板Palette,当然,这里是对那些须要调色板的位图文件而言的。有些位图,如真彩色图,前面已经讲过,是不须要调色板的,BITMAPINFOHEADER后直接是位图数据。

调色板实际上是一个数组,共有biClrUsed个元素(若是该值为零,则有2biBitCount个元素)。数组中每个元素的类型是一个RGBQUAD布局,占4个字节,其定义如下:

typedef struct tagRGBQUAD {

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

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

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

BYTE rgbReserved; //保存值

} RGBQUAD;

第四项目组就是实际的图象数据了。对于用到调色板的位图,图象数据就是该象素颜在调色板中的索引值。对于真彩色图,图象数据就是实际的R、G、B值。下面针对2色、16色、256色位图和真彩色位图分别介绍。

对于2色位图,用1位就可以默示该象素的色彩(一般0默示黑,1默示白),所以一个字节可以默示8个象素。

对于16色位图,用4位可以默示一个象素的色彩,所以一个字节可以默示2个象素。

对于256色位图,一个字节正好可以默示1个象素。

对于真彩色图,三个字节才干默示1个象素,哇,好费空间呀!没办法,谁叫你想让图的色彩显得更亮丽呢,有得必有失嘛。

要重视两点:

(1)每一行的字节数必须是4的整倍数,若是不是,则须要补齐。这在前面介绍biSizeImage时已经提到了。

(2)一般来说,.bMP文件的数据从下到上,从左到右的。也就是说,从文件中最先读到的是图象最下面一行的左边第一个象素,然后是左边第二个象素……接下来是倒数第二行左边第一个象素,左边第二个象素……依次类推,最后获得的是最上方一行的最右一个象素。

当懂得了这些后,就可以将图片灰度化,编程曲直短长二色图片。再读出bmp文件的像素信息,可以将其存储在一个一维数组里面,其他的信息还有宽度和高度。今后处理惩罚图片就是直接对这个数组进行处理惩罚。接下来是进行去噪处理惩罚。一些图片经常有噪点,对辨认结果造成影响,所以必须进行去噪。去噪办法很多。我的做法是对一个像素点作如下处理惩罚:取它和四周8个点共9个点的像素的均匀值,结果还可以。

接下来的操纵我都是参考的一篇哈尔滨产业大学工学硕士学位论文,上方的思路很清楚,感触感染很不错。起首是归一化,即将图片编程32*32大小的图片。

另一种办法长短线性归一化,然则上方的求质心和散度公式看不清楚,并且没有告诉怎么用质心和散度去实现归一化。所以我就采取了线性归一化。结果比非线性归一化要差一些。

归一化之后是特点提取。

网格特点就是将32*32的图片分成4*4共16块,每个方块64个小方块。求黑色像素的个数就行了。穿越特点包含程度穿越特点和垂直穿越特点。程度穿越特点即把图片按行分成8行,每行4小行。策画每一行由白色像素到黑色像素的变更次数即可。即获得前8维程度穿越特点t1,t2,..,t8。后8维程度穿越特点哄骗公式求解。Pi=ti/[(t1+t2+..+t8)*10+0.5]。垂直穿越特点则类似。

16维网格特点、16维程度穿越特点和16维垂直穿越特点合起来统共48维特点。还可以求加权特点,形成64维特点。

最后是模板匹配。按照响应特点值的差值的平方和进行匹配。

1 #include

2 #include

3 #include

4 #include

5 #include

6 #include

7 #include

8 #include

9

10

//---------------------------------------------------------------------------------------

11 //以下该模块是完成BMP图像(彩色图像是24bit RGB各8bit)的像素获取,并存在文件名为xiang_su_zhi.txt中

12 unsigned char *pBmpBuf;//读入图像数据的指针

13

14 int bmpWidth;//图像的宽

15 int bmpHeight;//图像的高

16 RGBQUAD *pColorTable;//色彩表指针

17

18 int biBitCount;//图像类型,每像素位数

19

20

//-------------------------------------------------------------------------------------------

21 //读图像的位图数据、宽、高、色彩表及每像素位数等数据进内存,存放在响应的全局变量中

22 bool readBmp(char *bmpName)

23 {

24 FILE *fp=fopen(bmpName,"rb");//二进制读体式格式打开指定的图像文件

25

26 if(fp==0)

27 return 0;

28

29 //跳过位图文件头布局BITMAPFILEHEADER

30

31 fseek(fp, sizeof(BITMAPFILEHEADER),0);

32

33 //定义位图信息头布局变量,读取位图信息头进内存,存放在变量head 中

34

35 BITMAPINFOHEADER head;

36

37 fread(&head, sizeof(BITMAPINFOHEADER), 1,fp); //获取图像宽、高、每像素所占位数等信息

38

39 bmpWidth = head.biWidth;

40

41 bmpHeight = head.biHeight;

42

43 biBitCount = head.biBitCount;//定义变量,策画图像每行像素所占的字节数(必须是4的倍数)

44

45 int lineByte=(bmpWidth * biBitCount/8+3)/4*4;//灰度图像有色彩表,且色彩表表项为256

46

47 if(biBitCount==8)

48 {

49

50 //申请色彩表所须要的空间,读色彩表进内存

51

52 pColorTable=new RGBQUAD[256];

53

54 fread(pColorTable,sizeof(RGBQUAD),256,fp);

55

56 }

57

58 //申请位图数据所须要的空间,读位图数据进内存

59

60 pBmpBuf=new unsigned char[lineByte * bmpHeight];

61

62 fread(pBmpBuf,1,lineByte * bmpHeight,fp);

63

64 fclose(fp);//封闭文件

65

66 return 1;//读取文件成功

67 }

68

69

//-----------------------------------------------------------------------------------------

70 //给定一个图像位图数据、宽、高、色彩表指针及每像素所占的位数等信息,将其写到指定文件中

71 bool saveBmp(char *bmpName, unsigned char *imgBuf, int width, int height, int biBitCount, RGBQUAD *pColorTable)

72 {

73

74 //若是位图数据指针为0,则没稀有据传入,函数返回

75

76 if(!imgBuf)

77 return 0;

78

79 //色彩表大小,以字节为单位,灰度图像色彩表为1024字节,彩色图像色彩表大小为0

80

81 int colorTablesize=0;

82

83 if(biBitCount==8)

84 colorTablesize=1024;

85

86 //待存储图像数据每行字节数为4的倍数

87

88 int lineByte=(width * biBitCount/8+3)/4*4;

90 //以二进制写的体式格式打开文件

91

92 FILE *fp=fopen(bmpName,"wb");

93

94 if(fp==0)

95 return 0;

96

97 //申请位图文件头布局变量,填写文件头信息

98

99 BITMAPFILEHEADER fileHead;

100

101 fileHead.bfType = 0 x4D42;//bmp类型

102

103 //bfSize是图像文件4个构成项目组之和

104

105 fileHead.bfSize= sizeof(BITMAPFILEHEADER) + sizeof (BITMAPINFOHEADER) + colorTablesize + lineByte*height;

106

107 fileHead.bfReserved1 = 0;

108

109 fileHead.bfReserved2 = 0;

110

111 //bfOffBits是图像文件前3个项目组所需空间之和

112

113 fileHead.bfOffBits=54+colorTablesize;

114

115 //写文件头进文件

116

117 fwrite(&fileHead, sizeof(BITMAPFILEHEADER),1, fp); 118

119 //申请位图信息头布局变量,填写信息头信息

120

121 BITMAPINFOHEADER head;

122

123 head.biBitCount=biBitCount;

124

125 head.biClrImportant=0;

127 head.biClrUsed=0;

128

129 head.biCompression=0;

130

131 head.biHeight=height;

132

133 head.biPlanes=1;

134

135 head.biSize=40;

136

137 head.biSizeImage=lineByte*height;

138

139 head.biWidth=width;

140

141 head.biXPelsPerMeter=0;

142

143 head.biYPelsPerMeter=0;

144

145 //写位图信息头进内存

146

147 fwrite(&head, sizeof(BITMAPINFOHEADER),1, fp); 148

149 //若是灰度图像,有色彩表,写入文件

150

151 if(biBitCount==8)

152 fwrite(pColorTable, sizeof(RGBQUAD),256, fp); 153

154 //写位图数据进文件

155

156 fwrite(imgBuf, height*lineByte, 1, fp);

157

158 //封闭文件

159

160 fclose(fp);

161

162 return 1;

163

165

166

//----------------------------------------------------------------------------------------

167 //以下为像素的读取函数

168 void doIt()

169 {

170

171 //读入指定BMP文件进内存

172

173 char readPath[]="nv.BMP";

174

175 readBmp(readPath);

176

177 //输出图像的信息

178

179 cout<<"width="<

194

195 if(biBitCount==8) //对于灰度图像

196 {

197

//-------------------------------------------------------------------

-----------------

198 //以下完成图像的分别成8*8小单位,并把像素值存储到指定文本中。因为BMP图像的像素数据是从

199 //左下角:由左往右,由上往下逐行扫描的

200 int L1=0;

201 int hang=63;

202 int lie=0;

203 //int L2=0;

204 //int fen_ge=8;

205 for(int fen_ge_hang=0;fen_ge_hang<8;fen_ge_hang++)//64*64矩阵行轮回

206 {

207 for(int fen_ge_lie=0;fen_ge_lie<8;fen_ge_lie++)

//64*64列矩阵轮回

208 {

209 //--------------------------------------------

210 for(L1=hang;L1>hang-8;L1--)//8*8矩阵行

211 {

212 for(int L2=lie;L2

214 m=*(pBmpBuf+L1*lineByte+L2);

215 outfile<

216 count_xiang_su++;

217 if(count_xiang_su%8==0)//每8*8矩阵读入文本文件

218 {

219 outfile<

220 }

221 }

222 }

223 //---------------------------------------------

224 hang=63-fen_ge_hang*8;//64*64矩阵行变换

225 lie+=8;//64*64矩阵列变换

226 //该一行(64)由8个8*8矩阵的行构成

227 }

228 hang-=8;//64*64矩阵的列变换

229 lie=0;//64*64juzhen

230 }

231 }

232

233 //double xiang_su[2048];

234 //ofstream outfile("xiang_su_zhi.txt",ios::in|ios::trunc); 235 if(!outfile)

236 {

237 cout<<"open error!"<

238 exit(1);

239 }

240 else if(biBitCount==24)

241 {//彩色图像

242 for(int i=0;i

243 {

244 for(int j=0;j

245 {

246 for(int k=0;k<3;k++)//每像素RGB三个分量分别置0才变成黑色

247 {

248 //*(pBmpBuf+i*lineByte+j*3+k)-=40;

249 m=*(pBmpBuf+i*lineByte+j*3+k);

250 outfile<

251 count_xiang_su++;

252 if(count_xiang_su%8==0)

253 {

254 outfile<

255 }

256 //n++;

257 }

258 n++;

259 }

260

261

262 }

263 cout<<"总的像素个素为:"<

264

cout<<"----------------------------------------------------"<

266

267 //将图像数据存盘

268

269 char writePath[]="nvcpy.BMP";//图片处理惩罚后再存储

270

271 saveBmp(writePath, pBmpBuf, bmpWidth, bmpHeight, biBitCount,pColorTable);

272

273 //清除缓冲区,pBmpBuf和pColorTable是全局变量,在文件读入时申请的空间

274

275 []pBmpBuf;

276

277 if(biBitCount==8)

278 []pColorTable;

279 }

280

281 void main()

282 {

283 doIt();

284 }

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 {?

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.图像数据区

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

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格式图像文件详析 首先请注意所有的数值在存储上都是按“高位放高位、低位放低位的原则”,如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色,增强

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位图调色板

调色板 调色板概述每个应用程序都有自己的调色板,使用调色板时要先向系统申请,调色板分为前台调色板和后台调色板,windows为优先级高的程序分配前台调色板. 我们经常会发现当启动一个大一点的程序时,桌面和其他应用程序的颜色变得粗糙起来,就是因为其他应用程序的调色板正在转为后台调色板. Windows系统内部保留了一个20种颜色的调色板,用来显示窗口,菜单等通用界面每个设备上下文都拥有一个逻辑调色板,如果要使用内部系统调色板(20种颜色)之外的颜色,则应该创建一个新的逻辑调色板并将其选入到设备上下文中.再把设备上下文中的逻辑调色板实现到系统调色板中,新的颜色才能实现.在逻辑调色板被实现到系统调色板时,Windows会建立一个调色板映射表,当设备上下文用逻辑调色板中的颜色绘图时,GDI绘图函数会查询调色板映射表以把像素值从逻辑调色板的索引转换成系统调色板的索引. 创建调色板BOOL CreatePalette(LPLOGPALETTE lpLogPalette ); 其中lpLogPalette是一个指向LOGPALETTE 结构的指针 typedef struct tagLOGPALETTE { WORD palVersion; //windows版本号,一般是0x300 WORD palNumEntries; //调色板中颜色表项的数目PALETTEENTRY palPalEntry[1]; //每个表项的颜色和使用方法 } LOGPALETTE; typedef struct tagPALETTEENTRY { BYTE peRed; //红(0-255) BYTE peGreen;// 绿 BYTE peBlue; //蓝 BYTE peFlags; //一般为0 } PALETTEENTRY; 上面只是建立了一个逻辑调色板,而逻辑调色板只是一张孤立的颜色表,并不能对系统产生影响,所以要使用调色板还需要下面这些函数CPalette* SelectPalette(CPalette* pPalette,BOOL bForceBackground ); 这个函数用来将一个调色板载入设备上下文,第一个参数是一个调色板指针,第二个参数用来指定调色板作为前景色还是背景色使用,为TURE时,作为背景色使用,为FALSE时,当窗口是活动窗口或活动窗口的子窗口是,调色板将做为前景色使用,否则做为背景色来使用.如果使用调色板的是一个内存设备上下文,则该参数被忽略. UINT RealizePalette( ); 该函数把设备上下文中的逻辑调色板实现到系统调色板中, 函数的返回值表明调色板映射表中有多少项被改变了这两个函数的使用如下: CPalette *pOldPalette ; CWindowDC dc(this) ; pOldPalette=dc.SelectPalette(&pal, FALSE) ;

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(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图像文件由三部分组成:位图文件头数据结构,它包含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图像文件格式是微软公司为其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,它以字节为单位,指示图像数据在文件内的起始地址,即图像数

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图片格式详解

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作扩展名)。 二.BMP格式结构 BMP文件的数据按照从文件头开始的先后顺序分为四个部分: ◆位图文件头(bmp file header):提供文件的格式、大小等信息 ◆位图信息头(bitmap information):提供图像数据的尺寸、位平面数、压缩方式、颜色索 引等信息 ◆调色板(color palette):可选,如使用索引来表示图像,调色板就是索引与其对应的颜色 的映射表 ◆位图数据(bitmap data):图像数据区 BMP图片文件数据表如下:

三.BMP文件头 BMP文件头结构体定义如下: typedef struct tagBITMAPFILEHEADER { UINT16 bfType; //2Bytes,必须为"BM",即0x424D 才是Windows位 图文件 DWORD bfSize; //4Bytes,整个BMP文件的大小 UINT16 bfReserved1; //2Bytes,保留,为0 UINT16 bfReserved2; //2Bytes,保留,为0 DWORD bfOffBits; //4Bytes,文件起始位置到图像像素数据的字节偏移量} BITMAPFILEHEADER; BMP文件头数据表如下:

VC中保存BMP位图文件的方法及BMP文件格式带源码实现

#include "stdio.h" #include "Windows.h" //几个全局变量,存放读入图像的位图数据、宽、高、颜色表及每像素所占位数(比特) //此处定义全局变量主要为了后面的图像数据访问及图像存储作准备 unsigned char *pBmpBuf;//读入图像数据的指针 int bmpWidth;//图像的宽 int bmpHeight;//图像的高 RGBQUAD *pColorT able;//颜色表指针 int biBitCount;//图像类型 bool readBmp(char *bmpName) { //二进制读方式打开指定的图像文件 FILE *fp=fopen(bmpName,"rb"); if(fp==0) return 0; //跳过位图文件头结构BITMAPFILEHEADER fseek(fp, sizeof(BITMAPFILEHEADER),0); //定义位图信息头结构变量,读取位图信息头进内存,存放在变量head中 BITMAPINFOHEADER head; fread(&head, sizeof(BITMAPINFOHEADER), 1,fp); //获取图像宽、高、每像素所占位数等信息 bmpWidth = head.biWidth; bmpHeight = head.biHeight; biBitCount = head.biBitCount; //定义变量,计算图像每行像素所占的字节数(必须是4的倍数) int lineByte=(bmpWidth * biBitCount/8+3)/4*4; //灰度图像有颜色表,且颜色表表项为256 if(biBitCount==8){ //申请颜色表所需要的空间,读颜色表进内存 pColorTable=new RGBQUAD[256]; fread(pColorTable,sizeof(RGBQUAD),256,fp); } //申请位图数据所需要的空间,读位图数据进内存 pBmpBuf=new unsigned char[lineByte * bmpHeight]; fread(pBmpBuf,1,lineByte * bmpHeight,fp);

BMP文件格式详解

BMP文件格式详解(BMP file format)(转) 转自:https://www.doczj.com/doc/f7661440.html,/Jason_Yao/archive/2009/12/02/1615295.html BMP(全称Bitmap)是Window操作系统中的标准图像文件格式,可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),使用非常广。它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。BMP文件的图像深度可选lbit、4bit、8bit及24bit。BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。 BMP文件格式,又称为Bitmap(位图)或是DIB(Device-Independent Device,设备无关位图),是Windows系统中广泛使用的图像文件格式。由于它可以不作任何变换地保存图像像素域的数据,因此成为我们取得RAW数据的重要来源。Windows的图形用户界面(graphical user interfaces)也在它的内建图像子系统GDI中对BMP格式提供了支持。 下面以Notepad++为分析工具,结合Windows的位图数据结构对BMP文件格式进行一个深度的剖析。 BMP文件的数据按照从文件头开始的先后顺序分为四个部分: bmp文件头(bmp file header):提供文件的格式、大小等信息 位图信息头(bitmap information):提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息 调色板(color palette):可选,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表 位图数据(bitmap data):就是图像数据啦^_^ 下面结合Windows结构体的定义,通过一个表来分析这四个部分。 我们一般见到的图像以24位图像为主,即R、G、B三种颜色各用8个bit来表示,这样的图像我们称为真彩色,这种情况下是不需要调色板的,也就是所

C语言处理单色BMP文件

使用C处理单色BMP照片首先要了解BMP文件的格式: BMP图片的扫描方式是从左到右,从下至上,对每个像素取值。一个扫描行所占的字节数为4的倍数,不足4的倍数系统自动扩展。 BMP文件包含一般包含4个部分(前三部分都是分开的结构体,是对数据的格式说明): 1、位图头文件(位图头文件包含的是整个文件的信息。 所有BMP文件的开始两个字节为0x424d,换为字符为BM,注 意输出BM的时候要以字符的形式一个一个的输出,如果以其 他格式,会使字符反向,这是源于内存中数据的存储方形成的。 位图头文件还包含整个文件的大小信息) 2、位图信息头(图像数据,即位图数据的格式与说明。) 3、颜色表(本文档只处理黑白文件,故不讨论颜色表) 4、位图数据(只包含图像的数据,格式包含于位图信 息头) 数据类型的定义: WORD=unsigned short int 2byte DWORD=unsigned int 4byte LONG=int 4byte

位图头文件包含元素(结构体):14byte WORD bfType;//文件类型,其中的数据是0x424d,也就是BM DWORD bfSize;//整个文件的大小 WORD bfReserved1; //保留字未用 WORD bfReserved2; //保留字未用 DWORD bfOffBits;//位图数据与文件起始位置的字节偏移量,就是//位图与WORD bfType 中0x424d,‘42’的字节偏移量。 位图信息头(结构体):40byte DWORD biSize; //值为40 LONG biWidth; // 位图的宽度,以像素为单位 LONG biHeight; // 位图的高度,以像素为单位 WORD biPlanes; // 设备级别,值为1 WORD biBitCount;//每个像素所占的位数(bit),单色为1 DWORD biCompression; // 位图的压缩类型,0表示未压缩DWORD biSizeImage; //实际位图所占的字节数 LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; 头两个部分相加为54字节,故在内存一字节对齐(见内存对齐)的前提下,只需定义一个54字节的结构体就可以了。 颜色表(略)、位图数据(略)

BMP图片处理--C语言

BMP图片处理--C语言(存储于读写) (2009-10-19 15:32:29) 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,表示所有颜色一样重要。

相关主题
文本预览
相关文档 最新文档