是这样的:PictureBox里画了很多线,别人要我把里面的图像内容转成bmp文件格式(最好不落地),然后把指针作为接口,他好在VC里调我的组件。
问题如下:
1.VB里的Picture或Image对象是不是本身就是bmp图片格式的?
2.我用stream读取一个bmp文件,这个流是不是标准的bmp格式?
3.VB里面怎么传指针?是传数组的第一个元素,还是要用VarPtr来获取对象的指针地址?

解决方案 »

  1.   

    bmp有内涵的,参阅:
    http://www.aivisoft.net/Documents/BMPFormat.htm
      

  2.   

    参考下面的代码,应该对你有帮助:'利用IPersistStream接口和IStream接口实现
    '可以从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
      

  3.   

    IPersistStream这个接口如何引用?
      

  4.   

    自己顶一下,另外VB里怎样向VC传数组?
      

  5.   

    byval varptr(a(0))
    或 byref a(0)VC那边用一个指针来接收就可以了
      

  6.   

    1.picutre和image和图片格式没有关系
    2.读入的是图片相应点的rgb颜色值,而bmp图像规定:2,8,16位的图像使用调色板表示颜色信息,而24位真彩色图片直接对应相应点的RGB值,也就是说只有读入24位真彩图片的时候,读取的文件才是标准的bmp格式
    3.vb里没有指针,所以变量设置any类型
      

  7.   

    16位BMP没有调色板。若有的话,调色板就要占256KB!:)
    标准BMP格式支持:
    1、4、8、24、32五种色深
    16位BMP很特殊,因其无法使用完整的RGB信息,无法做到设备无关性,一般只在DDB中使用。
      

  8.   

    1、非压缩BMP图象文件格式说明
    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从图象的左下角开始逐行扫描图象,既从左到右,从下到上,将图象的象素值一一记录下来,这些记录像素值的数组形成了位图阵列。