CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  API

如何用API将StdPicture转成Byte数组?不用第三方类库!请给个实例!在线等,分不够可再加!

楼主DragonCity1()2006-05-04 20:53:43 在 VB / API 提问

不要用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

相关问题

关键词

得分解答快速导航

  • 帖主:DragonCity1

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo