我目前是使用了SavePicture将图片保存到文件,然后再发送文件,接收方将内容保存到文件后再LoadPicture,如果能直接取得图片内容,或剪贴板里的图片内容,到对方再直接送入图片或送入剪贴板,就省了文件存取过程。
图象复制到剪贴板时,其实只复制了一个索引,并没有真正复制图片内容,所以Clipboard.getdata得到的只是索引,没有图片内容。

解决方案 »

  1.   

    下面代码中封装的PictureFromRes函数可以根据byte数组得到stdpicture对象:Option ExplicitPrivate Type GUID
      Data1 As Long
      Data2 As Integer
      Data3 As Integer
      Data4(7) As Byte
    End TypePrivate Declare Function CreateStreamOnHGlobal Lib "ole32.dll" (ByRef hGlobal As Any, ByVal fDeleteOnResume As Long, ByRef ppstr As Any) As Long
    Private Declare Function OleLoadPicture Lib "olepro32.dll" (ByVal lpStream As IUnknown, ByVal lSize As Long, ByVal fRunMode As Long, ByRef riid As GUID, ByRef lplpObj As Any) As Long
    Private Declare Function CLSIDFromString Lib "ole32.dll" (ByVal lpsz As Long, ByRef pclsid As GUID) As Long' HKEY_CLASSES_ROOT\Interface\{7BF80980-BF32-101A-8BBB-00AA00300CAB} = IPicture
    Private Const SIPICTURE As String = "{7BF80980-BF32-101A-8BBB-00AA00300CAB}"' convert a byte array to IPicturePublic Function PictureFromRes(ByRef b() As Byte) As IPicture
      On Error GoTo errorhandler
      
      Dim istrm As IUnknown
      Dim tGuid As GUID
      
      If Not CreateStreamOnHGlobal(b(LBound(b)), False, istrm) Then
        CLSIDFromString StrPtr(SIPICTURE), tGuid
        OleLoadPicture istrm, UBound(b) - LBound(b) + 1, False, tGuid, PictureFromRes
      End If
      
      Set istrm = Nothing
      Exit Function
    errorhandler:
      Debug.Print "Could not convert to IPicture!"
    End Function
      

  2.   

    我也很感兴趣。
    以前把数据库中BLOB图片取出来都要先变成文件,确实有点烦。
      

  3.   

    存:
    Public Ptream As New ADODB.Stream       
     Ptream.Type = adTypeBinary
            Ptream.Open
            If Len(FilesName) <> 0 Then
               Ptream.LoadFromFile FilesName
               Rs.Fields("picture").Value = Ptream.Read
            Else
               Rs.Fields("picture").Value = ""
            End If
    取:
       FilesName = App.Path & "\picfile.chg"
       Ptream.Type = adTypeBinary
       Ptream.Open
       Ptream.Write Rs.Fields("picture").Value
       If Len(FilesName) <> 0 Then
          Ptream.SaveToFile FilesName, adSaveCreateOverWrite
          Image1.Picture = LoadPicture(FilesName)
          Call Frm_MDI.PicRef_Wwg
       Else
          Image1.Picture = Nothing
       End If
       Ptream.Close
      

  4.   

    至于保存stdpicture到byte数组,恐怕就只能根据bmp的文件格式写了
      

  5.   

    这有一个类模块,我推荐你看一下:
    http://www.vbaccelerator.com/home/VB/Utilities/Bitmap_Extractor/VB6_Bitmap_Extractor_zip_cAlphaDibSection_cls.asp
      

  6.   

    没解决,我只是说:把一个PICTUREBOX里的图片送到一个BYTE变量里。
      

  7.   

    这样吧:发送方用api函数GetBitmapBits得到一个byte数组,发送,接收方获得数据后用SetBitmapBits还原图象或者你尝试一下用dib解决,可能会更快一些
      

  8.   

    或者参考:
    http://community.csdn.net/Expert/topic/3209/3209104.xml?temp=.2357904
      

  9.   

    GetBitmapBits怎么使用啊?其中3个参数?我手底下没有API说明,帮我解释一下
      

  10.   

    【函数】
    GetBitmapBits【操作系统】
    Win9X:Yes
    WinNT:Yes【声明】
    GetBitmapBits Lib "gdi32" Alias "GetBitmapBits" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long【说明】  将来自位图的二进制位复制到一个缓冲区 【返回值】  Long,如执行成功,返回位图中的字节数量;零表示失败。会设置GetLastError 【其它】  虽然这个函数能正常工作,但强烈建议使用与设备无关的位图(GetDIBits)【参数表】
      hBitmap --------  Long,位图的句柄  dwCount --------  Long,欲复制的字节数。如设为零,表示取得位图中的字节数  lpBits ---------  Any,指向容纳位图位的一个缓冲区的指针。注意事先将缓冲区至少初始化成dwCount个字节    函数功能:该函数将指定位图的位拷贝到缓冲区里。    函数原型:LONG GetBitmapBits(HBITMAP hbmp, LONG cbBuffer, LPVOID lpvBits);    参数:    hbmp:指向感兴趣的位图的句柄。    cbBuffer:指定要从位图拷贝到缓冲区的字节数。    lpvBits:指向接收位图位数据的缓冲区指针。这些位是按字节类型存储在数组中的。    返回值:如果该函数执行成功,那么返回值就是拷贝到缓冲区的字节数;如果该函数执行失败,那么返回值为0。    Windows NT:若想获得更多错误信息,请调用GetLastError函数。