如何用API将StdPicture转成Byte数组?不用第三方类库!请给个实例!在线等,分不够可再加!
不要用PictureBox控件,也最好不要用hDC。
测试通过立即给分。分不够可再加!
问题点数:50、回复次数:10Top
1 楼supergreenbean(超级绿豆(MSMVP - VB) - 升级归来~)回复于 2006-05-04 21:40:50 得分 0
那用savepicture 直接保存到盘上呢?Top
2 楼DragonCity1()回复于 2006-05-04 22:03:09 得分 0
原则上就是避免写文件。希望直接在内存操作。而且最好能区分Bitmap/JPG/ICO等不同的格式.
见过网上用olelib.tlb来实现的代码,效果不错,但是我希望不用ActiveX组件,直接用API完成.
网上找到的代码如下:
Public Sub Picture2Array(ByVal oObj As StdPicture, ByRef aBytes() As Byte)
Dim oIPS As olelib.IPersistStream
Dim oStream As olelib.IStream
Dim hGlobal As Long
Dim lPtr As Long
Dim lSiz As Long
Dim Hdr As PictureHeader
Set oIPS = oObj
Set oStream = olelib.ole32.CreateStreamOnHGlobal(0, True)
oIPS.Save oStream, True 'Save The Input StdPicture to IPersistStream
hGlobal = olelib.ole32.GetHGlobalFromStream(oStream)
lSiz = olelib.kernel32.GlobalSize(hGlobal)
lPtr = olelib.kernel32.GlobalLock(hGlobal)
If lPtr Then
lSiz = lSiz - Len(Hdr)
ReDim aBytes(0 To lSiz - 1)
MoveMemory aBytes(0), ByVal lPtr + Len(Hdr), lSiz
End If
GlobalUnlock hGlobal
Set oStream = Nothing
DebugPringArrayToRows aBytes()
Debug.Assert 0
End Sub
据来源网页中说,也可以用API来实现,但是并没有给出代码.
也就是说,我希望能用API实现上述代码的功能.能否请高手帮忙翻译一下?我试了好几天都不行!
请给出完整的代码,包括API声明!Top
3 楼supergreenbean(超级绿豆(MSMVP - VB) - 升级归来~)回复于 2006-05-04 22:42:57 得分 0
这段代码就是用api实现的,如果你不通过IPersistStream来实现的话,那就只能用GetDIBits之类的GDI函数了Top
4 楼DragonCity1()回复于 2006-05-05 09:37:52 得分 0
上述代码可以说绝大部分是用api实现的。
但关键是这一句不知道怎么改,因为没有直接对应的API函数:
oIPS.Save oStream, True 'Save The Input StdPicture to IPersistStream
查微软的帮助,找到了OleSaveToStream函数,是相关的,但是不知道如何在VB中声明API并赋参数。请高人给个实例!
Top
5 楼DragonCity1()回复于 2006-05-05 09:39:01 得分 0
您好!请再帮我看看帖子:
http://community.csdn.net/Expert/topic/4730/4730468.xml?temp=.4409296
主 题: 如何用API将StdPicture转成Byte数组?不用第三方类库!请给个实例!在线等,分不够可再加!
我最近的回帖:
上述代码可以说绝大部分是用api实现的。
但关键是这一句不知道怎么改,因为没有直接对应的API函数:
oIPS.Save oStream, True 'Save The Input StdPicture to IPersistStream
查微软的帮助,找到了OleSaveToStream函数,是相关的,但是不知道如何在VB中声明API并赋参数。请高人给个实例!
Top
6 楼supergreenbean(超级绿豆(MSMVP - VB) - 升级归来~)回复于 2006-05-05 11:44:52 得分 0
你不必修改啊,直接在工程里面引用那个olelib.tlb就可以了,最后你程序编译完了发布时不需要那个tlb文件Top
7 楼DragonCity1()回复于 2006-05-05 18:42:24 得分 0
刚才我试验了以下,如果没有带这个olelib.tlb而直接将编译后的可执行文件copy到新的windows2000professional机器的话,是可以成功运行。并且这台目标机器上的确不存在olelib.tlb文件。
olelib.IPersistStream、olelib.IStream这两个类在工程中是由olelib.tlb定义的(如果没有理解错的话,应该是接口定义文件吧?)。
在没有引用这个tlb文件的情况下,我想,一定有其它一个文件提供了这两个类库的定义。是哪个文件呢?Top
8 楼supergreenbean(超级绿豆(MSMVP - VB) - 升级归来~)回复于 2006-05-05 18:46:45 得分 0
tlb文件中定义是是这两个接口的描述,这样,vb在编译的时候就会把相应的接口方法的调用转换成相应的汇编代码,至于这两个接口实例的具体实现你是没有必要去关心的Top
9 楼Summer006(脸都丢尽了!闭关修练。。。。)回复于 2006-05-05 19:03:50 得分 0
我好像有个类可以实现:
不要用PictureBox控件, ok
也最好不要用hDC 。。。似乎用到了,但是否可以去除 不祥。
需要的话联系我坝
Top
10 楼magichelp()回复于 2006-05-08 09:15:27 得分 0
告诉你一个最简单的方法
Dim Bag As New PropertyBag
Dim B() As Byte
Bag.WriteProperty "Image", P.Picture
ReDim B(LenB(Bag.Contents))
B = Bag.Contents
PropertyBag是VB内置的对象,基本上可以串行化的对象均可以写入.
给分吧!!
MagicHelp
http://www.gethelpsoft.com
Top




