游戏开发论坛

 找回密码
 立即注册
搜索
查看: 12425|回复: 2

WIA模型及其参考

[复制链接]

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 2005-12-27 10:48:00 | 显示全部楼层 |阅读模式
    最近看了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上,本人撰写
sf_2005122710487.bmp

0

主题

1

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2010-10-19 16:11:00 | 显示全部楼层

Re: WIA模型及其参考

r6u56e[prekg[kw[erk[gkwer[kgw

45

主题

1163

帖子

1165

积分

金牌会员

Rank: 6Rank: 6

积分
1165
发表于 2010-10-20 09:07:00 | 显示全部楼层

Re:WIA模型及其参考

学习学习
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-8-18 15:55

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表