在前面幾節,我通過調用CommonDialog對象的ShowAcquireImage方法來掃描圖像,這是一個彈出選擇裝置對話框,讓使用者自己掃描的過程。有時候,我們不想把過程弄得那麼複雜,隻想使用者點選按鈕後,自動開始掃描。本節我将嘗試這個需求。
WIAAL模型
在開始代碼前,再回顧以下WIAAL模型,這裡選取其中的一小部分:
和
從上圖不難想象,一台掃描器,實際上就是一個Device對象,是以,我們可以通過DeviceManager來“獲 取”這台裝置的“引用”,然後通過得到的Device對象,執行相應的掃描工作。進而跳過了使用ShowAcquireImage方法帶來的一系列“多餘 的滑鼠操作問題”。
擷取Device對象
按照上面思路,首先需要建立一個DeviceManager對象:
DeviceManager
manager
= new
DeviceManagerClass
();
然後擷取Device對象,在這裡,我假設我的電腦上隻有一台掃描器,是以不做諸如“判斷使用哪台掃描器進行掃描”之類的操作。
Device
device
= null
;
foreach
(DeviceInfo
info
in
manager
.DeviceInfos
)
{
if
(info
.Type
!= WiaDeviceType
.ScannerDeviceType
) continue
;
device
= info
.Connect
();
break
;
}
掃描圖像
WIA把Device裝置的圖像資料看做一個個Item對象,可以通過方法GetItem(ItemID)來實作。不過,對于掃描器做種東西,和數位相機不同,一般隻有一個Item對象,是以可以簡單的使用數組的方法(注意:index是從1開始的,而不是從0):
Item
item
= device
.Items
[1];
最後,調用CommonDialog的ShowTransfer方法,用一個進度條,來顯示掃描過程:
CommonDialogClass
cdc
= new
WIA
.CommonDialogClass
();
ImageFile
imageFile
= cdc
.ShowTransfer
(item
,
"{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}"
,
true
) as
ImageFile
;
if
(imageFile
!= null
)
{
var
buffer
= imageFile
.FileData
.get_BinaryData
() as byte
[];
using
(MemoryStream
ms
= new
MemoryStream
())
{
ms
.Write
(buffer
, 0, buffer
.Length
);
pictureBox1
.Image
= Image
.FromStream
(ms
);
}
}
關于ShowTransfer方法
CommonDialog的ShowTransfer方法,實際上就是ShowAcquireImage方法的最後一個步驟,顯示一個擷取圖檔的進度條:
聲明如下:
public virtual object
ShowTransfer
(Item
Item
, string
FormatID
, bool
CancelError
);
對于第二個參數,FormatID,可以使用以下值:
- wiaFormatBMP ({B96B3CAB-0728-11D3-9D7B-0000F81EF32E})
- wiaFormatPNG ({B96B3CAF-0728-11D3-9D7B-0000F81EF32E})
- wiaFormatGIF ({B96B3CB0-0728-11D3-9D7B-0000F81EF32E})
- wiaFormatJPEG ({B96B3CAE-0728-11D3-9D7B-0000F81EF32E})
- wiaFormatTIFF ({B96B3CB1-0728-11D3-9D7B-0000F81EF32E})