在VB图像处理中BMP位图的详细说明
长期以来,关于图像处理中位图的格式搞不清楚,现在终于有点清楚了. 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补齐 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,这项工作主要包括以下两步: 最后发一个写的存储图像的函数 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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |