none
从byte数组到图片的问题 RRS feed

  • 问题

  • 主要代码如下(摘自网络):
    Public Function BytesToPicture(PictureData() As Byte) As StdPicture
        Dim IID_IPicture(3) As Long
        Dim oPicture As IPicture
        Dim nResult As Long
        Dim oStream As IUnknown
        Dim hGlobal As Long
        ' Array f¨?llen um den KlassenID (CLSID) IID_IPICTURE
        ' zu simulieren
        IID_IPicture(0) = &H7BF80980
        IID_IPicture(1) = &H101ABF32
        IID_IPicture(2) = &HAA00BB8B
        IID_IPicture(3) = &HAB0C3000
        ' Stream erstellen
        Call CreateStreamOnHGlobal(VarPtr(PictureData( _
                                          LBound(PictureData))), 0, oStream)
        ' OLE IPicture-Objekt erstellen
        nResult = OleLoadPicture(oStream, 0, 0, IID_IPicture(0), oPicture)
        If nResult = 0 Then
            Set BytesToPicture = oPicture
        End If
    End Function
    Private Sub Command1_Click()
        Dim x As StdPicture
    Set x = BytesToPicture(Word.Selection.EnhMetaFileBits)
    '此x对象没有x.hPal属性
    ' Set x = Clipboard.GetData(2)
    ''    Debug.Print x.Handle; x.Height; x.Width; x.hPal
    '    Me.Picture1.Picture = x
    '    Set x = Me.Picture1.Image
    '    Debug.Print x.Handle; x.Height; x.Width; x.hPal
    End Sub
    EnhMetaFileBits是Word中Range/Selection对象的一个属性
    返回一个 Variant 类型的值,该值表示选定文本或文本区域的显示方式的图片表示。
    注释  EnhMetaFileBits 属性返回一个字节数组,该数组可在 Microsoft Visual Basic 或 Microsoft C++ 开发环境中通过 Microsoft Windows 32 应用程序编程接口来使用。
    expression.EnhMetaFileBits
    expression    必需。该表达式返回“应用于”列表中的一个对象。
    示例
    以下示例返回 EnhMetaFileBits 属性。
    Dim bytSelection() As Byte
    bytSelection = Selection.EnhMetaFileBits
    问题:
    当该属性返回的一个数组使用BytesToPicture函数返回的StdPicture/IPicture类型的对象时,不具备hPal属性,它导致无法进一步直接使用GDI+(GdipCreateBitmapFromHBITMAP)函数取得该图片对象的句柄,从而无法进行后续操作。
    如果将该数组赋值于PictureBox时,可以正确显示图片,并且通过Set x = Me.Picture1.Image再取得的StdPicture/IpictureDisp类时,具有hPal属性,能够进行GDI+相关操作。
    如果直接将图象复制于剪贴板时,从剪贴板中获得的StdPicture对象,也具有hPal属性,也能正确进行GDI+的相关操作。
    然而,当我们从WORD文档中内插的图片中,使用剪贴板或者PicutreBox控件时,所取得的图片有失真(后续操作证明),我希望直接从EnhMetaFileBits返回的数组中直接得到StdPicture类的句柄或者是真正的StdPicutre类,该通过何种方式解决?
    网上搜索了N天了,未果,希高手指点,谢谢
    相关代码链接:http://blog.csdn.net/laviewpbt/archive/2006/05/26/756547.aspx
    补充:我以Word中插入一个图片和以LoadPicture方法加载一个图片(相同的图片),前者使用EnhMetaFileBits返回的数组为0 to 3651,而使用加载图片后取得的数组为0 to 1695。

    2008年11月1日 12:57
    版主