標籤:
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");}
結果如下:
在C#中使用WIA擷取掃描器資料