代码改变世界

BMP图像文件格式

2010-12-01 16:12  bingcaihuang  阅读(356)  评论(0编辑  收藏  举报

第一部分为位图文件头BITMAPFILEHEADER, 它是一个结构体,其定义如下: 
 typedef struct tagBITMAPFILEHEADER{
  WORD    bfType; //文件类型,在WINDOWS系统中为“BM”
  DWORD  bfSize; //文件大小
  WORD  bfReserved1; //保留字
  WORD  bfReserved2; //保留字
  DWORD  bfOffBits; //从文件头到实际位图的偏移字节数
} BITMAPFILEHEADER;

这个结构的长度是固定的,为14个字节(WORD为无符号16位二进制整数,DWORD为无符号32位

第二部分为位图信息头BITMAPINFOHEADER,也是一个结构:
typedef struct tagBITMAPINFOHEADER{
  DWORD   biSize; //该结构的长度,为40字节
  LONG biWidth; //图像的宽度,单位为像素
  LONG biHeight;    //图像的高度,单位为像素
  WORD biPlanes; //位平面数,必须是1
  WORD biBitCount; //指定颜色数,1为二值,4为16色,8为
                                                       256 色,16、24、32为真彩色    
  DWORD biCompression; //指定是否压缩,有效的值为BI_RGB,

第三部分为调色板(Palette),只是对那些需要调色板的位图文件而言的。调色板实际上是一个数组, 共有biClrUsed个元素(如果该值为零,则有2的biBitCount次方个元素)。数组中每个元素的类型是一个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) 每一行的字节数必须是4的整数倍,如果不是,则需要补齐。
      (2) BMP文件的数据存放是从下到上,从左到右的。也就是说, 从文件中最先读到的是图像最下面一行的左边第一个像素, 然后是左边第二个像素, 接下来是倒数第二行左边第一个像素, 左边第二个像素。依次类推, 最后得到的是最上面一行的最右边的一个像素。
        DIB(Device Independent Bitmap)图像格式是设备无关位图文件,描述图像的能力基本与BMP相同,并且能运行于多种硬件平台,只是文件较大。

DWORD biSizeImage; //实际的位图数据占用的字节数
LONG biXPelsPerMeter;//目标设备水平分辨率
LONG biYPelsPerMeter;//目标设别垂直分辨率
DWORD biClrUsed;//实际使用的颜色数,若该值为0,则使用的颜色数为2的biBitCount次方种。
DWORD biClrImportant; //图像中重要的颜色数,若该值为0,则所有的颜色都是重要的。
          } BITMAPINFOHEADER;
  其中,biCompression的有效值为BI_RGB、 BI_RLE8、 BI_RLE4、BI_BITFIELDS,这都是一些Windows定义好的常量。由于RLE4和RLE8的压缩格式用的不多,今后仅讨论biCompression的有效值为BI_RGB,即不压缩的情况。