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 2010有一個好處,可以自動裝配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 = new FileStream(@"c:\1.bmp", FileMode.Open, FileAccess.Read, FileShare.Read)) { pictureBox1.Image = Image.FromStream(stream); } File.Delete(@"c:\1.bmp"); }
結果如下: