wia模型:WIA模型及其参考



最近看了MSDN上WIA模型(MicrosoftWindowsImageAcquisition)及网上点资料弄过来和大家探讨

按照微软概念WIA模型是Windows应用和数码相机扫描仪等设备进行通讯个接口它也是基于COM早期数码设备都是遵循TWAIN工业模型标准微软在它家庭版WindowsME中引入了WIA模型到了WindowsXP做了相应升级也就是说它只支持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=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接口该接口用来访问视频流比如摄像机的类注意它不能处理视频数据只能对数据进行预览并发出个拍照指令从视频中截取张静态图片如果需要处理视频可以使用DirectShowWIA模型没有这个功能

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



我们来简单看个WIA例子

\'建立WIACOM设备管理接口
DimwiaManagerAsNewWIALib.WiaClass
DimselectUsingUIAsObject
selectUsingUI=.Reflection.Missing.value

\'获得数码设备
DimwiaRootAsWIALib.ItemClass
wiaRoot=wiaManager.Create(selectUsingUI)

\'显示个系统对话框
DimwiaPicsAsWIALib.CollectionClass
wiaPics=wiaRoot.GetItemsFromUI(WIALib.WiaFlag.SingleImage,WIALib.WiaIntent.ImageTypeColor)

\'遍历设备中所有内容
DimwiaObjAsObject
DimwiaItemAsWIALib.ItemClass
DimimageFileNameAsString
ForEachwiaObjInwiaPics
wiaItem=.Runtime.InteropServices.Marshal.CreateWrapperOfType(wiaObj,Type.GetType("WIALib.ItemClass"))

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

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

原文在http://www.eobj.net上本人撰写
\" border=0>相关档案:\" border=0>sf_2005122710487.bmp (96390s)

Tags:  wia模型

延伸阅读

最新评论

发表评论