图形/图像
WIA的脚本和NET(扫描仪开发)
2017-02-07 10:00:02

免责声明:本文放大器的信息,源代码是按照最后的[V1]位出版NET框架。摘要此示例显示了如何使用Windows XP的Windows图像采集(WIA)脚本。NET和C#。它集成扫描仪,数码相机,摄像头和视频仍然是有用的。注意,本文不从阅读详细威亚文档保存你!威亚WIA是一个标准化的Win32 API收购,主要是用来捕获静止图像的设备,并负责管理这些设备的数字图像。威亚介绍与Windows Millennium和Windows XP的更新。今天,大多数数字成像设备是内置或制造商提供了WIA驱动程序支持XP。。。。。。API是暴露COM接口,在两种形式:威亚自定义接口 - 主要是为C程序员。威亚脚本模型 - 脚本languagues设计,它提供了一个类型库。一个无缝和低努力的一体化。NET(目前)唯一可能与WIA的脚本。WIA的脚本WIA脚本模型中描述。需要获得一个形象的典型步骤如下:创建WIA管理COM对象。随着威亚经理的帮助,让用户选择一个成像设备(扫描仪/相机/...).选定的设备获取作为一个新的WIA根设备项目(另一个COM对象)的访问。有了这种设备项目中,我们提出了一个GUI对话框拿起照片的用户。这些图片获取WIA图像项目的集合访问。最后,我们可以将这些图像项目如每个磁盘上的文件!伪代码看起来那样简单:经理=新威亚根= manager.Create集= root.GetItemsFromUI收集[0 .. N]。转移威亚提供其自己的通用对话框,选择一个设备:和如具体到一个扫描仪设备,对话框...或特定拍照摄像设备:注意,有些任务还没有用户(GUI)的相互作用。其中一种方法的Item.TakePicture,但你应该检查为一个完整的列表文档。WIA脚本模型组织所有已知项目(设备,文件夹层次结构,例如,图片,...)。一个先进的应用递归可枚举此树使用的Item.Children属性:如根摄像装置 root.Children item1的   ; 项目2,如文件夹 item2.Children item21例如图片 & #160;item22例如图片2守则要使用WIA的脚本在您的Visual Studio。NET项目,添加一个引用的组件"Microsoft Windows图像采集1.01类型库"(wiascr.dll)如果没有VS.NET,你将不得不使用TLBIMP工具。现在你可以在您的C#代码文件的顶部添加WIA脚本命名空间:使用System.IO;使用System.Runtime.InteropServices;/ /进口威亚脚本COM组件的命名空间使用WIALib;这进口的库命名空间提供的WIA脚本类型的映射NET包装类。威亚= GT; WiaClassDeviceInfo = GT; DeviceInfoClass项目= GT; ItemClassItem.Children = GT; CollectionClass ,现在可以写像这样的简化示例代码获得图片:/ /创建COM实例威亚经理wiaManager =新WiaClass();对象selectUsingUI = System.Reflection.Missing.Value;/ /让用户选择设备wiaRoot =(ItemClass)wiaManager.Create( 文献selectUsingUI);/ /调用显示的共同威亚对话框让/ /用户选择图片:wiaPics = wiaRoot.GetItemsFromUI(WiaFlag.SingleImage WiaIntent.ImageTypeColor)作为CollectionClass;/ /枚举所有用户选定的图片的foreach(对象wiaPics wiaObj) { wiaItem =(ItemClass)Marshal.CreateWrapperOfType( 0; wiaObj,typeof运算(ItemClass)); / /创建图像的临时文件 imageFileName = Path.GetTempFileName(); / /传输图片到我们的临时文件 wiaItem.Transfer(imageFileName,FALSE);}对于COM互操作和WIA调试的详细信息阅读这两篇文章:异步传输和活动有些设备,尤其是摄像头串行COM端口上的照片,很慢!因此,它会采取多秒来传输照片。威亚脚本解决了这个问题与异步标志时使用Item.Transfer:/ /异步传输图片文件wiaItem.Transfer(imageFileName,TRUE);通知关于完成转让和更多的应用,WIA经理公开三件大事:OnTransferComplete - 文件传输完成OnDeviceDisconnected - 设备例如不插电OnDeviceConnected - 一个新的设备连接这些活动很好地地图NET事件/委托模型,所以我们像这样添加一个处理函数:/ /委派的成员变量私人_IWiaEvents_OnTransferCompleteEventHandler wiaEvtTransfer;... .../ /创建事件委托wiaEvtTransfer =新_IWiaEvents_OnTransferCompleteEventHandler(  0; this.wia_OnTransferComplete);/ /订阅事件wiaManager.OnTransferComplete = wiaEvtTransfer;... .../ /事件处理函数(回调从威亚!)公共无效wia_OnTransferComplete( WIALib.Item项目,字符串路径){ ... ... / /逻辑处理完成转移}视频对于网络摄像机或其他视频设备,在Windows XP的WIA有一个伟大的新功能:实时视频流叠加!它使用DirectShow中绘制的图形卡上的叠加。可以访问导入另一个COM类型库:"WiaVideo 1.0类型库"(wiavideo.dll)。不幸的是,嵌入式TLB有错误传递一个窗口句柄的方法。我用ILDASM中得到互操作程序集的IL代码,然后,我改变了所有不正确的发生"的ValueType _RemotableHandleamp";"本土INT",那么最后编译与ILASM大会。这包括修复的DLL是作为WIAVIDEOLib.dll下载。的代码显示在窗口的实时和实时视频流,可以作为这两个步骤简单:wiaVideo =新WiaVideoClass();wiaVideo.CreateVideoByWiaDevID( wiaDeviceID,window.Handle,0,1);,从目前的视频流,并采取快照JPEG图像可以用单一的方法:/ /这个字符串将得到的图片的文件名... ...字符串jpgFile;/ /调用IWiaVideo::TakePicturewiaVideo.TakePicture(出jpgFile);检查包括视频采样!样品使用Visual Studio NET项目的全部源代码,这些样品提供:WiaEasyImage非常简单的应用程序访问WIA扫描仪和照相机。WiaEasyVideo应用程序只使用WIA视频设备,并显示实时视频流叠加。WiaScriptSample先进的应用程序使用最WIA脚本功能。限制再次,仅适用于Windows XP!如果你需要。NET旧系统的成像,Windows Me具有一个旧版本的威亚,但你不能使用该版本的相同的代码/从这些样本的类型库。WIA的设备,必须充分检测和配置由Windows。据我所知,威亚需要您的应用程序有[STAThread]的Main()方法用于启动应用程序的属性。Item.Thumbnail被排除在外,因为它使用了一个未公开的异步可插入协议(APP)的有错误。只测试代码与奥林巴斯的Digi - CAM,爱普生扫描仪,罗技QuickCam,和索尼DV摄像机。