偶然的因素,需要把一个点阵转换成图像,所以对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.
{***************************************************************************************}