WIA(Windows Image Acquire,最新版本2.0)是Windows中一组从设备中捕获图像的标准API集合,它可以从设备(例如扫描仪、数码相机)中获取静态图像,以及管理这些设备。它既是API,又是DDI(Device Driver Interface)。因此,只要是满足这个规范的设备,都能够利用WIA直接和应用程序交互,而不是通过驱动。WIA甚至提供了统一的对话框来获取图片。
WIA是基于Com的,有两种使用方式:
- c++:使用WIA自定义接口
- 其他:使用WIAAL(WIA Automation Layer)。
注:在Windows XP sp1以前的版本,WIAAL还不存在,因此第二种方式用的是WIA Scripting Model。
在.Net中使用WIA,我们用的是第二种方法。接下来做一个简单的图像扫描程序:
界面
新建一个WinForm应用程序,在上面添加一个按钮和一个图片框,点击按钮时启动扫描进程,然后在图片框中显示图像,应用程序界面如下:
使用WIA
Visual Studio 2008有一个好处,可以自动装配Com组件,在工程中添加一个WIA的COM引用:
点击确定后,会在工程引用中添加一个WIA.Interop.dll的文件,可以在对象浏览器中查看它:
打开扫描对话框
接下来可以利用WIA来进行扫描了,步骤很简单,首先引用命名空间:
using WIA;
接下来,在button的Click事件中,添加如下代码:
ImageFile imageFile = null; CommonDialogClass cdc = new WIA.CommonDialogClass(); try {imageFile = cdc.ShowAcquireImage(WIA.WiaDeviceType.ScannerDeviceType,WIA.WiaImageIntent.TextIntent, WIA.WiaImageBias.MaximizeQuality, "{00000000-0000-0000-0000-000000000000}", true, true, false); } catch (System.Runtime.InteropServices.COMException) {imageFile = null; }
WIA会自动弹出标准扫描对话框,进行扫描操作:
获取图像
调用ShowAcquireImage后,扫描后的数据就保存在ImageFile对象里了。用以下方法读取ImageFile中的数据(该方法很傻很傻……很傻)
if (imageFile != null) { imageFile.SaveFile(@"c:/1.bmp"); using (FileStream stream = newFileStream(@"c:/1.bmp", FileMode.Open, FileAccess.Read, FileShare.Read)) { pictureBox1.Image= Image.FromStream(stream); } File.Delete(@"c:/1.bmp"); }
结果如下: