我想把 内存中的图片通过网络传输,要把显示在picturebox中的图片,或通过API创建的DIB位图,保存到一个二进制数组,在另外一台电脑上还原回位图
不能通过 savepicture 函数保存到磁盘上再读出来, 我想在内存中完成 ,我已有几个API 函数原形StretchDIBits 
SetDIBitsToDeviceSetDIBitsGetDIBits 
GetBitmapBits
SetBitmapBits 
但不知道用法, 谁有代码,请帮我一下,急用,在线等 !

解决方案 »

  1.   

    API函数及结构声明和常数自己加上去模块中的函数Private PicInfo As BITMAP         'bitmap info structure
    Private DIBInfo As BITMAPINFO     'Device Ind. Bitmap info structure'pic待读取数据位图,data保存图象数据
    Public Sub ReadPic(ByVal pic As Long, data() As Byte)   '读取位图数据
      Dim hdcNew As Long
      Dim oldhand As Long
      Dim ret As Long
      Dim BytesPerScanLine As Long    '一个扫描行的长度
      Dim PadBytesPerScanLine As Long
      Call GetObject(pic, Len(PicInfo), PicInfo)         '取得对指定对象进行说明的一个结构,hobject为位图,刷子等的句柄,
                                                          'count欲取回的字节数。通常是由lpObject定义的那个结构的长度
      hdcNew = CreateCompatibleDC(0&)                    '创建一个与屏幕兼容的设备场景
      oldhand = SelectObject(hdcNew, pic)
      With DIBInfo.bmiHeader
        .biSize = 40                                       'bmp3.0
        .biWidth = PicInfo.bmWidth
        .biHeight = -PicInfo.bmHeight     '从下往上扫描
        .biPlanes = 1
        .biBitCount = 32                 '32位位图,默认情况下Windows不会处理最高8位,可以将它作为自己的Alpha通道
        .biCompression = BI_RGB          '无压缩
        BytesPerScanLine = ((((.biWidth * .biBitCount) + 31) \ 32) * 4)  '一个扫描行的长度,是4的倍数。
        PadBytesPerScanLine = _
        BytesPerScanLine - (((.biWidth * .biBitCount) + 7) \ 8)
        .biSizeImage = BytesPerScanLine * Abs(.biHeight)
      End With
      ReDim data(1 To 4, 1 To PicInfo.bmWidth, 1 To PicInfo.bmHeight) As Byte
      ret = GetDIBits(hdcNew, pic, 0, PicInfo.bmHeight, data(1, 1, 1), DIBInfo, DIB_RGB_COLORS)
                       '将来自一幅位图的二进制位复制到一幅与设备无关的位图里
                  ' 该函数利用申请到的内存,由GDI位图得到DIB位图数据,可以对DIB的格式进行控制,通过该函数,
                    '可以制定颜色的位数,而且可以指定是否进行压缩。如果采用了压缩方式,则必须调用该函数两次,
                    '一次为了得到所需内存,另外一次为了得到位图数据
                    '定义了与设备有关位图hBitmap的配置信息的一个设备场景的句柄
                    'hbmp 源位图的句柄
                    'uStartScan为欲复制到dib中的第一条扫描线的位置
                    'cScanLines欲复制的扫描先的数量
                    'ipvbits 指向一个缓冲区的指针
                    '指向BITMAPINF,对DIB的格式及颜色进行说明的一个结构。
                    '颜色表包含了RGB颜色
               
       SelectObject hdcNew, oldhand
       DeleteDC hdcNew
    End Sub窗体中调用Private iDATA() As Byte             'holds bitmap data
    Private Sub Command1_Click()
    Picture1.ScaleMode = 3
    ReDim iDATA(1 To 4, 1 To Picture1.ScaleWidth, 1 To Picture1.ScaleHeight) As Byte
    Call ReadPic(Picture1.Image, iDATA())
    Debug.Print iDATA(2, 54, 34)
    End Sub
      

  2.   

    这样iDATA中就保存了图象的数据,还有一种方法用二进制方式打开图片,也可以,还比较简单,
    Open strFileName For Binary As #lNum
      

  3.   

    http://blog.csdn.net/wallescai/archive/2004/12/31/235270.aspx
      

  4.   

    编译通不过啊,。    Call ReadPic(Picture1.Image, iDATA())      Public Sub ReadPic(ByVal pic As Long, data() As Byte)  提示参数有误
      

  5.   

    Picture1.Image是默认属性传法,应该可以,你换成Picture1.Image.handle试试
    这个函数用于你的目的,总体感觉不够完美
      

  6.   

    laviewpbt(人一定要靠自己) :请教  ,怎样 GetDIBits 得到 把二进制的数组还原回位图啊 ???
      

  7.   

    明天就要回家了,现在忙着收拾东西,你参考一下以下的文章吧,这里还有其他好多高手呢!!
    zyl910啊,WallesCai啊等等向他们请教吧。祝你好运!
    Private Declare Function SetDIBits Lib "gdi32" Alias "SetDIBits" (ByVal hdc As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Longhttp://www.21code.com/codebase/?pos=list&type=subclass&mainclass=1&subclass=13
    http://community.csdn.net/Expert/topic/3600/3600495.xml?temp=.8192407
    http://community.csdn.net/Expert/topic/3252/3252001.xml?temp=.6536524
    http://community.csdn.net/Expert/topic/3667/3667654.xml?temp=.2818872
      

  8.   

    用纯 VB 就可以实现
    Dim a() As BytePrivate Sub Command1_Click()
        Dim pb As New PropertyBag
        pb.WriteProperty "Img", Picture1.Picture
        a = pb.Contents
    End SubPrivate Sub Command2_Click()
        Dim pb As New PropertyBag
        pb.Contents = a
        Set Picture2.Picture = pb.ReadProperty("Img")
    End Sub
      

  9.   

    Tiger_Zhao(VB老鸟) :用你给的代码可以实现,但速度太慢!