BMP文件格式的及应用

1. BMP文件的组成
   BMP文件的结构分成3 块或4块,分别是 文件头,文图信息头, 颜色表, 位图数据。
  对于真彩色图片,没有颜色表这块,所以它的结构分成3块。
  该结构列表如下:
   BMP文件格式
  
  模块 组 成 内 容
  文件头 包含文件的大小、文件类型、图像数据偏离文件头的长度
  位图信息头 信息头尺寸、图像用几个比特数值表示一个像素、图像是否压缩、图像所用的颜色数
  颜色信息 包含图像所用到的颜色表,显示图像时需用到这个颜色表来生成调色板,但如果图像为真彩色,既图像的每个像素用24个比特来表示,文件中就没有这一块信息,也就不需要操作调色板。
  图形数据 表示图像的相应的像素值
  
  
  各模块的数据结构如下:
  数据结构:
  
  文件头

typedef struct ITMAPFILEHEADER{

WORD bfType; // 位图文件的类型,必须为“BM”DWORD
bfSize; // 位图文件的大小,以字节为单位WORD
bfReserved1; //保留字,必须为0WORD
bfReserved2; //保留字,必须为0DWORD
bfOffBits; // 位图数据的偏移量,以字节为单位

} BITMAPFILEHEADER; 该结构占据14个字节。
  

位图信息头

 typedef struct ITMAPINFOHEADER{

DWORD biSize; // 本结构所占用字节数LONG
biWidth; // 位图的宽度,以像素为单位LONG
biHeight; // 位图的高度,以像素为单位WORD
biPlanes; // 须为1WORD
biBitCount // 每个像素所需的位数,是 1(双色), 4(16色),8(256色)或 24(真彩色)DWORD
biCompression; // 位图压缩类型,必须是 0(不压缩),1(BI_RLE8压缩类型)或 2(BI_RLE4压缩类型)DWORD
biSizeImage; // 位图数据区域的大小, 以字节为单位LONG
biXPelsPerMeter; // 位图水平分辨率,每米像素数LONG
biYPelsPerMeter; // 位图垂直分辨率,每米像素数DWORD
biClrUsed; // 位图实际使用的颜色表中的颜色数DWORD
biClrImportant; // 位图显示过程中重要的颜色数

} BITMAPINFOHEADER; 该结构占据40个字节。
  颜色信息

typedef struct tagRGBQUAD {

BYTE rgbBlue; // 蓝色的亮度(值范围为0-255)BYTE
rgbGreen; // 绿色的亮度(值范围为0-255)BYTE
rgbRed; // 红色的亮度(值范围为0-255)BYTE
rgbReserved; // 保留,必须为0

} RGBQUAD;
  

图形数据 表示图像的相应的像素值
  
  
  
  2. BMP文件数据存储特点
  
  对于整个文件 从左到右, 从下到上(最下一行 To 最上一行)
  对于每行 从左到右
  每行存储 字节数须为4(long型)的倍数,不足要以0补齐
  
  
  
  3. BMP文件分析
  
  
  
  windows 下该文件属性为: 96*9, 单色, 170Bytes
  分析类容的结果是:
   文件头:
  typedef struct tagBITMAPFILEHEADER
  {
   WORD bfType; 0x4D42
   DWORD bfSize; AA (170Bytes)
   WORD bfReserved1; 0
   WORD bfReserved2; 0
   DWORD bfOffBits; 3E (62)
  } BITMAPFILEHEADER;
  位图信息头:
  typedef struct tagBITMAPINFOHEADER
  {
   DWORD biSize; //表示本结构的大小 28 (40Bytes)
   LONG biWidth; //位图的宽度 60 (96)
   LONG biHeight; //位图的高度 09 (09)
  WORD biPlanes; // 1
   WORD biBitCount; //位图的位数 分为1 4 8 16 24 32 本文没对1 4 进行研究 1
   DWORD biCompression; //本以为压缩类型,但是却另外有作用,稍候解释 0
   DWORD biSizeImage; //表示位图数据区域的大小以字节为单位 6c (108)
   LONG biXPelsPerMeter; 0EC4
   LONG biYPelsPerMeter; 0EC4
   DWORD biClrUsed; 0
   DWORD biClrImportant; 0
  } BITMAPINFOHEADER;
  
  
  
  
  
  颜色表:
   FF FF , FF 00 , 00 00 , 00 00
  分别是: R G B 保留
  共计 4 Bytes, 后面的就是数据区了。数据是108Bytes, 即信息头中biSizeImage 的值
  
  4.
  BMP使用的格式:
  1. 从位图底端开始扫描,以横向32bit (4Bytes) 为单位,不足4Bytes, 按照
   4Bytes计算。
   2. 扫描过程中,不足部分用0填充。
  3. 横向左边为高位,右边为低位。
  因此,对于 PixWidth * PixHeight 的单色图片,
   BMP文件大小为:
   (横向: 1――32 按照 32; 33――64 按照64…..)
  BMPData:
  (( PixWidth -1) / 32 +1)*32 * PixHeight Bits
  
   5. 一些概念
  
  对于 PixWidth * PixHeight 的单色BMP位图,有这些关系(实际上文件并部分行和列):
   BMP格式:
   每行的字节数: ((PixWidth-1)/32+1)*4
   共有PixHeight 行
   有效行 ((PixWidth-1)/8+1)
  
  
  概 念 描述
  色深 1,4,8,16,24
  颜色数 表示有多少种颜色,例如256色
  灰度图像 Eg. 8位的BMP图片相当于把黑白分成256级,0为黑,255为白。该数值表示灰度或亮度。我们称这种图片为灰度图,单色图和灰度图称黑白图,与之对应的是彩色图
  RGB R对应红,G对应绿,B对应蓝色,它们统称为三基色

posted on 2011-05-25 16:32  深蓝工作室  阅读(2007)  评论(0编辑  收藏  举报