长期以来,关于图像处理中位图的格式搞不清楚,现在终于有点清楚了.
DIB文件有四个主要部分:
文件头(file hearder)
位图信息头(information header)
RGB颜色表(RGB color table),24位位图没有
位图像素(bitmap pixel bits)
DIB在内存中的格式只有后面三个部分,没有文件头。
在内存中,一个完整的DIB由两部分组成:一个BITMAPINFO结构和一个存储像素阵列的数组。BITMAPINFO描述了位图的大小,颜色模式和调色板等各种属*,其定义为
'***********************************************
'***********************************************
Public Type BITMAPINFO
bheader As BITMAPInfoHeader
bColors As RGBQUAD ‘调色板
End Type
'************************************************
1,RGBQUAD结构用来描述颜色,其定义为
'*************************************************
Public Type RGBQUAD '定义RGB色信息.在BMP中是以BGR顺序存储的
‘.这是DIB文件的调色板信息
bb As Byte
gg As Byte
rr As Byte
rgbReserved As Byte '预留,用于存储32位图像中的亮度信息.
End Type
'***********************************************
注意,RGBQUAD结构中的颜色顺序是BGR,而不是平常的RGB。
2,BITMAPInfoHeader结构包含了DIB的各种信息,其定义为
Public Type BITMAPInfoHeader '文件信息头——BITMAPINFOHEADER
bmSize As Long '本结构所占用字节数(14-17字节)
bmWidth As Long '位图的宽度,以像素为单位(18-21字节)
bmHeight As Long '位图的高度,以像素为单位(22-25字节)
bmPlanes As Integer '目标设备的级别,必须为1(26-27字节)
bmBitCount As Integer '每个像素所需的位数,必须是1(双色),(28-29字节),4(16色), 8(256色) 或 24(真彩色)之一
bmCompression As Long '位图压缩类型,必须是 0 (不压缩),(30-33字节),1(BI_RLE8压缩类型)或 2(BI_RLE4压缩类型)之一
bmSizeImage As Long '位图的大小,以字节为单位(34-37字节)
bmXPelsPerMeter As Long '位图水平分辨率,每米像素数(38-41字节)
bmYPelsPerMeter As Long '位图垂直分辨率,每米像素数(42-45字节)
bmClrUsed As Long '位图实际使用的颜色表中的颜色数(46-49字节)
bmClrImportant As Long '位图显示过程中重要的颜色数(50-53字节)
End Type
‘*****************************************************************
DIB的字节数组是从图象的最下面一行开始的逐行向上存储的,也即等于把图象倒过来然后在逐行扫描。另外,字节数组中每个扫描行的字节数必需是4的倍数,如果不足要用0补齐
DIB可以存储在*.BMP或*.DIB文件中。DIB文件是以BITMAPFILEHEADER结构开头的,该结构的定义为
Public Type BmFileHeader
bfType(0 To 1) As Byte ‘文件类型,必须为"BM"
bfSize As Long ‘文件的大小
bfReserved1 As Integer ‘为0
bfReserved2 As Integer ‘为0
bfOffBits As Long ‘存储的像素阵列相对于文件头的偏移量
End Type
‘************************************************************
紧随该结构的是一个BITMAPINFOHEADER结构,然后是RGBQUAD结构组成的颜色表(如果有的话),文件最后存储的是DIB的像素阵列。
DIB的颜色信息储存在自己的颜色表中,程序一般要根据颜色表为DIB创建逻辑调色板。在输出一幅DIB之前,程序应该将其逻辑调色板选入到相关的设备上下文中并实现到系统调色板中,然后再调用相关的GDI函数(如::SetDIBitsToDevice或::StretchDIBits)输出DIB。在输出过程中,GDI函数会把DIB转换成DDB,这项工作主要包括以下两步:
将DIB的颜色格式转换成与输出设备相同的颜色格式。例如,在真彩色的显示模式下要显示一个256色的DIB,则应该将其转换成24位的颜色格式。
将DIB像素的逻辑颜色索引转换成系统调色板索引。
最后发一个写的存储图像的函数
Public Function SaveBIN(Carr() As Byte,ByVal Filenames As String) As Long
Dim bheader As BITMAPInfoHeader
With bheader
'**************************************
.bmBitCount = 24 '位图宽度,在这里图像采集卡的位图是24位,非32位 " .bmBitCount = 32 "改成24
.bmCompression = 0&
.bmPlanes = 1
.bmSize = Len(bit24.bheader)
'**********************************
.bmWidth = INW
.bmHeight = INH
.bmSizeImage = ((INW * 3 + 3) And &H7FFFFFFC) * H
End With
Dim hF As Integer
hF = FreeFile(1)
Filenames = Filenames & Year(Now) & Month(Now) & Day(Now) & Replace(Time$,":","")
If Dir(App.path & "\bmpImage",vbNormal Or vbReadOnly Or vbSystem Or vbHidden Or vbDirectory) = "" Then
MkDir (App.path & "\bmpImage") '如果不存在文件夹就创建
End If
Thepath = App.path & "\bmpImage\" & Filenames & ".bmp"
Open Thepath For Binary As hF
Dim bfh As BmFileHeader
bfh.bfType(0) = Asc("B")
bfh.bfType(1) = Asc("M")
bfh.bfOffBits = Len(bfh) + Len(bheader)
Put hF,bfh
Put hF,bheader
Put hF,Carr()
Close hF
End Function