BMP图像的格式及应用

来源:互联网 发布:445端口攻击 编辑:程序博客网 时间:2024/06/12 03:26

 偶然的因素,需要把一个点阵转换成图像,所以对BMP图像做了一些了解。

BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。文件头主要包含文件的大小、文件类型、图像数据偏离文件头的长度等信息;位图信息头包含图象的尺寸信息、图像用几个比特数值来表示一个像素、图像是否压缩、图像所用的颜色数等信息。颜色信息包含图像所用到的颜色表,显示图像时需用到这个颜色表来生成调色板,但如果图像为真彩色,既图像的每个像素用24个比特来表示,文件中就没有这一块信息,也就不需要操作调色板。文件中的数据块表示图像的相应的像素值,需要注意的是:图像的像素值在文件中的存放顺序为从左到右,从下到上,也就是说,在BMP文件中首先存放的是图像的最后一行像素,最后才存储图像的第一行像素,但对与同一行的像素,则是按照先左边后右边的的顺序存储的;另外一个需要读者朋友关注的细节是:文件存储图像的每一行像素值时,如果存储该行像素值所占的字节数为4的倍数,则正常存储,否则,需要在后端补0,凑足4的倍数。

以下是我在DELPHI下生成的BMPStructs:

{***************************************************************************************}
unit BMPStructs;

interface

uses

  Windows, Messages, SysUtils, Variants,Classes,ComCtrls;


type
{********************************************************
BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。
按照微软的定义,在开始的文件头由14个字节组成:
 **************************************************************************}
  BITMAPFILEHEADER= packed record
    bfType:WORD; // 位图文件的类型,必须为BM
    bfSize:DWORD; // 位图文件的大小,以字节为单位
    bfReserved1:WORD; // 位图文件保留字,必须为0
    bfReserved2:WORD; // 位图文件保留字,必须为0
    bfOffBits:DWORD; // 位图数据的起始位置,以相对于位图
  // 文件头的偏移量表示,以字节为单位
  End;  {14B}

  BITMAPINFOHEADER= packed record
    biSize:DWORD; // 本结构所占用字节数
    biWidth:LONGINT; // 位图的宽度,以像素为单位
    biHeight :LONGINT; // 位图的高度,以像素为单位
    biPlanes:WORD; // 目标设备的级别,必须为1
    biBitCount :WORD; // 每个像素所需的位数,必须是1(双色),
    // 4(16色),8(256色)或24(真彩色)之一
    biCompression :DWORD; // 位图压缩类型,必须是 0(不压缩),
    // 1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
    biSizeImage :DWORD; // 位图的大小,以字节为单位
    biXPelsPerMeter:LONGINT; // 位图水平分辨率,每米像素数
    biYPelsPerMeter:LONGINT; // 位图垂直分辨率,每米像素数
    biClrUsed:DWORD;// 位图实际使用的颜色表中的颜色数
    biClrImportant:DWORD;// 位图显示过程中重要的颜色数
  End; {40B}

  RGBQUAD = packed record
    rgbBlue:BYTE;// 蓝色的亮度(值范围为0-255)
    rgbGreen:BYTE; // 绿色的亮度(值范围为0-255)
    rgbRed:BYTE; // 红色的亮度(值范围为0-255)
    rgbReserved:BYTE;// 保留,必须为0
  end; {4B}

  BITMAPINFO = packed record
    bmiHeader :BITMAPINFOHEADER; // 位图信息头
    bmiColors :Array[0..1] of RGBQUAD; // 颜色表 2个表项,黑白
    //黑白图像biBitCount=1,此时每位表示一个象素,位值为0则使用颜色表中的bmiColors[0],
    //位值为1则使用颜色表中的bmiColors[1]
  End; {(40+4*n)B}

  //整个一幅320*240位图数据
  MyBITMAP = packed record
    MyHeader        :BITMAPFILEHEADER;
    MyBitMapInfo    :BITMAPINFO;
    MyBitDataArray  :Array[0..9599] of Byte;//点阵数据
  end;
//****************************************************************************//

Const
  //Device_Busy           :byte = $F4 ;
Var
  //SendBuffer        :array[0..4096] of byte;//发送命令缓冲区
 
implementation

end.
{***************************************************************************************}