天天看點

(轉)在C#中使用WIA擷取掃描器資料(四、通過程式設計方式掃描圖像)

在前面幾節,我通過調用CommonDialog對象的ShowAcquireImage方法來掃描圖像,這是一個彈出選擇裝置對話框,讓使用者自己掃描的過程。有時候,我們不想把過程弄得那麼複雜,隻想使用者點選按鈕後,自動開始掃描。本節我将嘗試這個需求。

WIAAL模型

在開始代碼前,再回顧以下WIAAL模型,這裡選取其中的一小部分:

(轉)在C#中使用WIA擷取掃描器資料(四、通過程式設計方式掃描圖像)

 和 

(轉)在C#中使用WIA擷取掃描器資料(四、通過程式設計方式掃描圖像)

從上圖不難想象,一台掃描器,實際上就是一個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方法的最後一個步驟,顯示一個擷取圖檔的進度條:

(轉)在C#中使用WIA擷取掃描器資料(四、通過程式設計方式掃描圖像)

聲明如下:

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})