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

fsdafsda12 2010-04-05 02:26:02
如题
如果用open语句打开一个binary的位图文件,并将数据存在一个byte()数组内
怎么能使这个byte()直接转化为stdpicture或直接在picturebox内输出而不生成临时文件
知道的帮帮小弟啦 在这谢过了
...全文
170 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
a1875566250 2010-04-05
  • 打赏
  • 举报
回复
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
xuggzu 2010-04-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 a1875566250 的回复:]
IUnknown和GUID
然后OleLoadPicture生成StdPicture
[/Quote]
参照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说的二进制数组。
a1875566250 2010-04-05
  • 打赏
  • 举报
回复
IUnknown和GUID
然后OleLoadPicture生成StdPicture
fsdafsda12 2010-04-05
  • 打赏
  • 举报
回复
就没人会吗 高手来啊 %>_<%
在线等。。。
fsdafsda12 2010-04-05
  • 打赏
  • 举报
回复
位图的开头有54位是对位图文件的描述比如文件大小,高,宽等。。。其余的部分按每三位结合就是图片点的RGB 有谁知道stdpicture的数据结构吗 知道了就好办了 高手快来啊
xuggzu 2010-04-05
  • 打赏
  • 举报
回复
位图文件数据不光是图片像素数据,还有信息数据(位图头,调色板等),一般使用api或者vb自带的函数提取位图文件或者资源时,该函数会自动分开信息和像素数据。lz的bin数组说白了就是整个位图文件,里面开头的一部分是信息数据,所以必须知道位图数据格式,然后只提取像素数据,根据信息中的数据构建调色板等,然后编码直接在picturebox中绘制图片。当然,如果能建立临时文件,自然方便的多。

809

社区成员

发帖
与我相关
我的任务
社区描述
VB 多媒体
社区管理员
  • 多媒体
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧