首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

[]关于byte数组转stdpicture有关问题 高手来 多谢了

2012-12-25 
[求助]关于byte数组转stdpicture问题 高手来 谢谢了如题如果用open语句打开一个binary的位图文件,并将数据

[求助]关于byte数组转stdpicture问题 高手来 谢谢了
如题
如果用open语句打开一个binary的位图文件,并将数据存在一个byte()数组内
怎么能使这个byte()直接转化为stdpicture或直接在picturebox内输出而不生成临时文件
知道的帮帮小弟啦 在这谢过了
[最优解释]
5L你真有心啊,呵呵,这样的确是对的,但是你写的太啰嗦了。。。

下面的代码就行了。。。

Public Function BytToPic(ByRef BytesIn() As Byte) As iPicture
Dim Stream As IUnknown, ID As GUID
CreateStreamOnHGlobal BytesIn(0), 0, Stream
CLSIDFromString StrConv("{7BF80980-BF32-101A-8BBB-00AA00300CAB}", vbUnicode), ID
OleLoadPicture Stream, UBound(BytesIn) + 1, 0, ID, BytToPic
End Function
[其他解释]
IUnknown和GUID
然后OleLoadPicture生成StdPicture
[其他解释]

引用:
IUnknown和GUID
然后OleLoadPicture生成StdPicture

参照4楼的建议,写了个例子代码:
界面放一个picturebox,一个command.

Option Explicit
Private Declare Function CreateStreamOnHGlobal Lib "ole32" (ByVal hGlobal As Long, ByVal fDeleteOnRelease As Long, ppstm As Any) As Long
Private Declare Function OleLoadPicture Lib "olepro32" (pStream As Any, ByVal lSize As Long, ByVal fRunmode As Long, riid As Any, ppvObj As Any) As Long
Private Declare Function CLSIDFromString Lib "ole32" (ByVal lpsz As Any, pclsid As Any) As Long
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal uFlags As Long, ByVal dwBytes 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 Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Const GMEM_ZEROINIT = &H40

Private Function GetPictureFromByteStream(bImageData() As Byte) As IPicture
    Dim lngByteCount As Long
    Dim hMem As Long
    Dim lpMem As Long
    Dim IID_IPicture(15)
    Dim IStream As stdole.IUnknown
    
    On Error GoTo Err_Init
    
    lngByteCount = UBound(bImageData) + 1 ' 计算数组大小
    hMem = GlobalAlloc(&H2 Or GMEM_ZEROINIT, lngByteCount) ' 按数组大小分配一块内存空间
    
    If hMem <> 0 Then ' 若分配内存成功
        lpMem = GlobalLock(hMem) ' 锁定内存, 返回第一块的指针
        If lpMem <> 0 Then
            CopyMemory ByVal lpMem, bImageData(0), lngByteCount


            Call GlobalUnlock(hMem)
            If CreateStreamOnHGlobal(hMem, 1, IStream) = 0 Then
                If CLSIDFromString(StrPtr("{7BF80980-BF32-101A-8BBB-00AA00300CAB}"), IID_IPicture(0)) = 0 Then
                    Call OleLoadPicture(ByVal ObjPtr(IStream), lngByteCount, 0, IID_IPicture(0), GetPictureFromByteStream)
                End If
            End If
        End If
    End If
    
    GlobalFree hMem
    Exit Function
Err_Init:
    MsgBox Err.Number & " - " & Err.Description
End Function

Private Sub Command1_Click()
    Dim bytData() As Byte
    Dim f As String
    Dim Fn As Integer
    f = "d:\p1.jpg"
    If Dir(f) = "" Then
        MsgBox "File not found"
        Exit Sub
    End If
    Fn = FreeFile
    Open f For Binary As #Fn
    ReDim bytData(LOF(1) - 1)
    Get #Fn, , bytData
    Close #Fn
    Set Picture1.Picture = GetPictureFromByteStream(bytData())
End Sub


其中bytData数组就相当于lz说的二进制数组。
[其他解释]
位图文件数据不光是图片像素数据,还有信息数据(位图头,调色板等),一般使用api或者vb自带的函数提取位图文件或者资源时,该函数会自动分开信息和像素数据。lz的bin数组说白了就是整个位图文件,里面开头的一部分是信息数据,所以必须知道位图数据格式,然后只提取像素数据,根据信息中的数据构建调色板等,然后编码直接在picturebox中绘制图片。当然,如果能建立临时文件,自然方便的多。
[其他解释]
位图的开头有54位是对位图文件的描述比如文件大小,高,宽等。。。其余的部分按每三位结合就是图片点的RGB 有谁知道stdpicture的数据结构吗 知道了就好办了 高手快来啊 
[其他解释]
就没人会吗 高手来啊 %>_<%
在线等。。。

热点排行