网页功能: 加入收藏 设为首页 网站搜索  
WIA模型及其参考
发表日期:2006-08-23作者:[转贴] 出处:  

   最近看了MSDN上的WIA模型(Microsoft Windows Image Acquisition )及网上的一点资料,弄过来与大家探讨。

    按照微软的概念,WIA模型是Windows应用程序与数码相机扫描仪等设备进行通讯的一个接口,它也是基于COM的。早期的数码设备都是遵循TWAIN工业模型标准的,微软在它的家庭版Windows ME中引入了WIA模型,到了Windows XP做了相应的升级。也就是说它只支持WinME和WinXP系统。微软打算用它来对抗TWAIN模型,WIA是自动兼容TWAIN的,这就有点像ADO和ODBC的关系(微软成功使用ADO赶走了工业ODBC)。

    下面来说说WIA模型接口

    WIA模型接口不多,有些还是空的(微软还没完成?),常用的有下面几个

    IWiaDataCallback
    IWiaDataTransfer
    IWiaDevMgr
    IWiaEventCallback
    IWiaItem
    IWiaPropertyStorage
    IWiaVideo

    IWiaDevMgr是WIA设备管理接口,用来检索系统中的WIA设备并建立与设备通讯的接口,它的功能很简单,常用的方法就是EnumDeviceInfo和CreateDevice。同时他还直接提供了访问设备UI的能力,就是不用写代码,直接弹出一个系统对话框让你选择设备。

    IWiaItem就是我们所访问的数码设备了,要注意的是,这个设备是逻辑上的不是物理上,可能设备下面还有设备,就像目录树一样,每个设备上都有可能有数据图片,同时我们可以向每个设备都发出指令,但实际上目录树除了遍历数码设备中的图片之外没什么用处,我们通常发出的指令只能针对根设备,就是物理上的设备,同样IWiaItem也提供了系统UI,也不用自己访问设备目录结构写读取数据的代码,直接调用设备对话框来获得图片信息。

root                                这里就是根Item,其实就是数码设备
+ root.Children
       item1
       item2                       这里的Item,有点像文件夹
       + item2.Children
             item21                这里可能就是图片1
             item22                这里可能就是图片2等等

伪代码如下:
manager = new Wia
root = manager.Create
collection = root.GetItemsFromUI
collection[0..n].Transfer


    IWiaPropertyStorage是设备属性接口,用来获取或设置各个接口的相关信息,用起来不是很方便,但整个接口的功能却非常简单清晰。

    IWiaEventCallback是设备事件接口,用来触发各种数码设备的事件,WIA的事件很少,不到30个。要注意的是Callback,既然是事件,需要Callback,那理所当然这个接口是个虚接口,需要重载才能使用,只有一个函数ImageEventCallback需要重载。

事件GUID
WIA_EVENT_CANCEL_IO 
WIA_EVENT_DEVICE_CONNECTED 
WIA_EVENT_DEVICE_DISCONNECTED
WIA_EVENT_ITEM_CREATED 
WIA_EVENT_ITEM_DELETED
WIA_EVENT_POWER_RESUME 
WIA_EVENT_POWER_SUSPEND
WIA_EVENT_SCAN_EMAIL_IMAGE 
WIA_EVENT_SCAN_FAX_IMAGE 
WIA_EVENT_SCAN_FILM_IMAGE
WIA_EVENT_SCAN_IMAGE
WIA_EVENT_SCAN_IMAGE2 
WIA_EVENT_SCAN_IMAGE3 
WIA_EVENT_SCAN_IMAGE4 
WIA_EVENT_SCAN_OCR_IMAGE 
WIA_EVENT_SCAN_PRINT_IMAGE 
WIA_EVENT_STI_PROXY
WIA_EVENT_STORAGE_CREATED 
WIA_EVENT_STORAGE_DELETED 
WIA_EVENT_TREE_UPDATED 
WIA_EVENT_VOLUME_INSERTED


    IWiaDataTransfer是用来传输数据的接口,通常和IWiaDataCallback结合起来使用,这样,我们就可以控制数据传输,当数码设备将数据传输给PC的时候,我们可以在这个接口上对数据进行处理。IWiaDataCallback同样是个虚接口,需要重载BandedDataCallback这个接口函数。

    最后来说一下IWiaVideo接口,该接口用来访问视频流,比如摄像机之类的,注意的是,它不能处理视频数据,只能对数据进行预览,并发出一个拍照的指令,从视频中截取一张静态的图片,如果需要处理视频,可以使用DirectShow,WIA模型没有这个功能。

    另外一点很重要,当我们在.NET中使用IWiaVideo,需要传递一个窗口句柄的参数,该参数是MIDL类型_RemotableHandle,对于托管代码来讲,没有对应的类型与其转换,也就是说.NET中无法给这个参数赋值。我在网上找到了相关的解决办法,就是先编译引用了Interop.WIAVIDEOLib的应用程序,会生成一个Interop.WIAVIDEOLib.dll文件,然后使用.NET托管代码反编译软件比如微软提供的ILASM,将这个dll反编译成IL中间语言,看不懂不要紧,用记事本等文本编辑器查找替换“valuetype _RemotableHandle&”这个类型为“native int”,然后重新编译成DLL文件,然后引用的时候,不要引用微软的WinVideo组件,引用我们编译好的DLL就OK了,凡是_RemotableHandle类型的参数我们就可以使用IntPtr来传递值了。

    我们来简单看一个WIA例子

'建立WIA COM设备管理接口
Dim wiaManager As New WIALib.WiaClass
Dim selectUsingUI As Object
selectUsingUI = System.Reflection.Missing.value

'获得数码设备
Dim wiaRoot As WIALib.ItemClass
wiaRoot = wiaManager.Create(selectUsingUI)

'显示一个系统的对话框
Dim wiaPics As WIALib.CollectionClass
wiaPics = wiaRoot.GetItemsFromUI(WIALib.WiaFlag.SingleImage, WIALib.WiaIntent.ImageTypeColor)

'遍历设备中的所有内容
Dim wiaObj As Object
Dim wiaItem As WIALib.ItemClass
Dim imageFileName As String
For Each wiaObj In wiaPics
    wiaItem = System.Runtime.InteropServices.Marshal.CreateWrapperOfType(wiaObj, Type.GetType("WIALib.ItemClass"))

    '获取一个临时文件名
    imageFileName = System.IO.Path.GetTempFileName

    '传输图片数据到该文件中
    wiaItem.Transfer(imageFileName, False)
Next

原文在http://www.eobj.net上,本人撰写

我来说两句】 【加入收藏】 【返加顶部】 【打印本页】 【关闭窗口
中搜索 WIA模型及其参考
本类热点文章
  WIA模型及其参考
  游戏中如何读取压缩包文件
  游戏中的资源打包
  游戏中的资源打包技术
  数据结构在游戏中的简单应用
  Tile文件的组织
  管理项目的好助手——VSS入门
  怎样在VC++中读取INI文件
  ADO数据库编程入门
  数据打包格式
  VC中调用ADO的常用方法
  读取光盘
最新分类信息我要发布 
最新招聘信息

关于我们 / 合作推广 / 给我留言 / 版权举报 / 意见建议 / 广告投放  
Copyright ©2003-2024 Lihuasoft.net webmaster(at)lihuasoft.net
网站编程QQ群   京ICP备05001064号 页面生成时间:0.00525