是这样的:PictureBox里画了很多线,别人要我把里面的图像内容转成bmp文件格式(最好不落地),然后把指针作为接口,他好在VC里调我的组件。
问题如下:
1.VB里的Picture或Image对象是不是本身就是bmp图片格式的?
2.我用stream读取一个bmp文件,这个流是不是标准的bmp格式?
3.VB里面怎么传指针?是传数组的第一个元素,还是要用VarPtr来获取对象的指针地址?
问题如下:
1.VB里的Picture或Image对象是不是本身就是bmp图片格式的?
2.我用stream读取一个bmp文件,这个流是不是标准的bmp格式?
3.VB里面怎么传指针?是传数组的第一个元素,还是要用VarPtr来获取对象的指针地址?
http://www.aivisoft.net/Documents/BMPFormat.htm
'可以从http://www.mvps.org/emorcillo/vb6/tlb/tl_ole.zip下载文件,下载后解压,并注册、引用olelib.tlbOption ExplicitConst GMEM_MOVEABLE = &H2
Const GMEM_ZEROINIT = &H40
Const GHND = (GMEM_MOVEABLE Or GMEM_ZEROINIT)
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalSize Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As LongConst PictureID = &H746C&Private Type PictureHeader
Magic As Long
Size As Long
End Type
Public Sub Picture2Array(ByVal oObj As StdPicture, aBytes() As Byte)
Dim oIPS As IPersistStream
Dim oStream As IStream
Dim hGlobal As Long
Dim lPtr As Long
Dim lSize As Long
Dim Hdr As PictureHeader
Set oIPS = oObj
Set oStream = CreateStreamOnHGlobal(0, True)
oIPS.Save oStream, True
hGlobal = GetHGlobalFromStream(oStream)
lSize = GlobalSize(hGlobal)
lPtr = GlobalLock(hGlobal)
If lPtr Then
lSize = lSize - Len(Hdr)
ReDim aBytes(0 To lSize - 1)
MoveMemory aBytes(0), ByVal lPtr + Len(Hdr), lSize
End If
GlobalUnlock hGlobal
Set oStream = NothingEnd Sub
Public Function Array2Picture(aBytes() As Byte) As StdPicture
Dim oIPS As IPersistStream
Dim oStream As IStream
Dim hGlobal As Long
Dim lPtr As Long
Dim lSize As Long
Dim Hdr As PictureHeader
Set Array2Picture = New StdPicture
Set oIPS = Array2Picture
lSize = UBound(aBytes) - LBound(aBytes) + 1
hGlobal = GlobalAlloc(GHND, lSize + Len(Hdr))
If hGlobal Then
lPtr = GlobalLock(hGlobal)
Hdr.Magic = PictureID
Hdr.Size = lSize
MoveMemory ByVal lPtr, Hdr, Len(Hdr)
MoveMemory ByVal lPtr + Len(Hdr), aBytes(0), lSize
GlobalUnlock hGlobal
Set oStream = CreateStreamOnHGlobal(hGlobal, True)
oIPS.Load oStream
Set oStream = Nothing
End If
End FunctionPrivate Sub Command1_Click()
Dim buff() As Byte
Picture2Array Picture1.Image, buff
'如果要指针的话,varptr(buff(0))就是所求
'测试
Set Picture2.Picture = Array2Picture(buff)
End Sub
或 byref a(0)VC那边用一个指针来接收就可以了
2.读入的是图片相应点的rgb颜色值,而bmp图像规定:2,8,16位的图像使用调色板表示颜色信息,而24位真彩色图片直接对应相应点的RGB值,也就是说只有读入24位真彩图片的时候,读取的文件才是标准的bmp格式
3.vb里没有指针,所以变量设置any类型
标准BMP格式支持:
1、4、8、24、32五种色深
16位BMP很特殊,因其无法使用完整的RGB信息,无法做到设备无关性,一般只在DDB中使用。
BMP图象文件由位图文件头、位图信息和位图阵列三个部分构成。BMP文件头和位图信息部分含有BMP图象文件的类型和打印格式等信息,另外还含有位图文件尺寸和颜色等信息。位图阵列记录了位图的每一个像素值,在生成位图文件时,从图象左下脚开始逐行扫描,将图象的像素值一一记录下来组成位图阵列。位图阵列有压缩和非压缩格式,BMP就是一种非压缩格式。
按图象中每个象素所占的位(bit)数,BMP图象有下列的分类:
表1 非压缩BMP图象分类
单色位图 16色位图 256色位图 16位位图 真彩色位图
位/象素 1位 4位 8位 16位 24位
色彩数 2 16 256 65536 16777215
2、非压缩BMP图象文件格式的数据结构描述
非压缩BMP图象文件的三部分组成:
• 位图文件头(BITMAPHEADER)数据结构
• 位图信息(BITMAPINFO)数据结构
• 位图阵列(BITMAPARRAY)
2.1、位图文件头数据结构包含BMP图象文件的类型,显示内容等信息。它的数据结构如下定义:
Typedef struct{ int bfType;//表明位图文件的类型,必须为BM
long bfSize;//表明位图文件的大小,以字节为单位
int bfReserved1;//属于保留字,必须为本0
int bfReserved2;//也是保留字,必须为本0
long bfOffBits;//位图阵列的起始位置,以字节为单位
} BITMAPFILEHEADER;
图1 位图文件头的数据结构
2.2、位图信息数据结构由BITMAPINFO和RGBQUAD两个数据结构组成,它的C语言数据结构如下图所示:
Typedef struct {
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColor[ ];
} BITMAPINFO;
图2 位图信息的数据结构
其中BITMAPINFOHEADER数据结构包含了有关BMP图象的宽,高,压缩方法等信息,它的C语言数据结构如下图所示:
Typedef struct {
long biSize; //指出本数据结构所需要的字节数
long biWidth;//以象素为单位,给出BMP图象的宽度
long biHeight;//以象素为单位,给出BMP图象的高度
int biPlanes;//输出设备的位平面数,必须置为1
int biBitCount;//给出每个象素的位数
long biCompress;//给出位图的压缩类型
long biSizeImage;//给出图象字节数的多少
long biXPelsPerMeter;//图像的水平分辨率
long biYPelsPerMeter;//图象的垂直分辨率
long biClrUsed;//調色板中图象实际使用的颜色素数
long biClrImportant;//给出重要颜色的索引值
} BITMAPINFOHEADER;
图3 BITMAPINFOHEADER数据结构
数据结构RGBQUAD定义一种颜色。它的结构如下图所示。
Typedef struct tagRGBQUAD {
unsigned char rgbBlue; //兰色的亮度
unsigned char rgbGreen; //绿色的亮度
unsigned char rgbRed; //红色的亮度
unsigned char rgbReserved;
} RGBQUAD;
图4 RGBQUAD数据结构
在RGBQUAD定义的颜色中,蓝色的亮度由rgbBlue定义,绿色的亮度由 rgbGreen定义,红色的亮度由rgbRed定义。RgbReserved必须为0。若某表项的值为:FF、00、00、00那么它定义的颜色为纯蓝色。
位图信息(BITMAPINFO)数据结构中的bmiColor[ ]是一个颜色表,用于说明图像中的颜色,相当于一个调色板。每一个表象都由RGBQUAD结构定义了一种颜色。
BmiColor[ ] 表项的个数由biBitCount来定。
当biBitCount=1,4,8时,bmiColor分别有2,16,256各表项。若某表项的值为n,则该象素的颜色为bmiColor[ n]所定义的颜色。
当biBitCount=24时,bmiColor[ ]表项为空。位图阵列的每三个字节表示一个像素,这3个字节直接定义了像素颜色中的蓝、绿、红的相对亮度。
2. 3、位图阵列记录了图象的每一个象素值,由于每个象素所占的位数由位图信息数据结构BITMAPINFO中BITMAPINFOHEADER数据结构的biBitCount分量定义,其数据结构无法形式的定义,只可以说明如下:
Typedef Pixel biBitCount定义的数据类型;
Pixel BITMAPARRAY[biWidth,biHeight]
图5 位图阵列的说明
在生成图象时,Windows从图象的左下角开始逐行扫描图象,既从左到右,从下到上,将图象的象素值一一记录下来,这些记录像素值的数组形成了位图阵列。