翁省輝,喻武龍,鄧世強
(北京理工大學 珠海學院,廣東 珠海 519085)
WIA是Windows image acquisition的簡稱,當前可用版本是 WIA 2.0。 它是 Windows Millennium Edition(Windows Me)或者更高版本的 Windows系統中提供的數字圖像獲取服務[1]。它是Windows系統中掃描儀獲取圖像的常用方式之一[2]。
WIA是使用進程外(out of process)服務實現的 com組件,和大多數進程外服務程序不同的是,WIA通過提供自己的數據傳送機制(iwiadatatransfer接口),避免了圖像數據傳送過程中的性能損失[3]。
WIA的體系結構如圖1所示[4]。
WIA整體分為三層,由上而下分別是UI層,服務層以及驅動層。UI層與服務層之間主要通過COM Interface聯系,而服務與驅動層則主要通過Win32 API聯系。驅動層可理解為系統的USBSCAN.SYS;中間的服務層為User Mode的動態庫文 件, 它 通 過 CreateFile,ReadFile,WriteFile和 Device IOControl來實現與設備進行通訊。

圖1 WIA的體系結構Fig.1 Architecture of WIA
WIA Driver實際實現中分為兩種:MiniDriver,MiniDriver。本文將分別介紹它們的實現。
MiniDriver分為兩個層次:WIA Service InterfaceLayer和Device Communication Layer, 其 中 Device Communication Layer就是 Low-Level driver,而 WIA Service InterfaceLayer則是實現的重點。
MicroDriver僅以動態庫形式實現3個接口函數,而MiniDriver則不同,它必須以COM Interface的形式實現。
MiniDriver有一個很重要的概念:Root Item和Child Item。Root Item代表設備本身,Child Item可視為設備支持的屬性,例如掃描儀支持TPA,Endorse,則它們可以被視為一個Child Item。MiniDriver初始化時需要首先創建Root Item的屬性,然后依次創建Child Item的屬性[5]。
MiniDriver在一開始初始化首先調用drvInitializeWia,須依次創建設備的Properties。
首先需要組織當前設備的特性資料,比如支持的數據格式(True Color之類)、數據傳輸方式、壓縮模式以及解析范圍等。然后調用drvInitItemProperties來初始化Child Item的Capabilities及 Properties。
初始化完成之后,便可以接受用戶的設定了,諸如掃描區域、色彩類型以及分辨率等。它主要是通過drv Write Properties來實現的,如圖2所示。

圖2 drvWriteProperties的操作示意圖Fig.2 Diagram of WriteProperties
然后是取得不同的參數,需要定義這樣一個數據:
PROPSPEC ps[9]={
{PRSPEC_PROPID,WIA_IPS_XRES},
{PRSPEC_PROPID,WIA_IPS_YRES},
{PRSPEC_PROPID,WIA_IPS_XPOS},
{PRSPEC_PROPID,WIA_IPS_YPOS},
{PRSPEC_PROPID,WIA_IPS_XEXTENT},
{PRSPEC_PROPID,WIA_IPS_YEXTENT},
{PRSPEC_PROPID,WIA_IPS_DATATYPE},
{PRSPEC_PROPID,WIA_IPS_BRIGHTNESS},
{PRSPEC_PROPID,WIA_IPS_CONTRAST},
}
這個數據用來存儲類型ID和將要獲取的掃描參數,通過調用wiasReadMutitipe來獲取值,由此可獲得掃描參數。
得到掃描參數后,便進入到數據傳輸階段了。Vista之前的系統有兩種方式:In-memory和File,Vista系統新增了一種方式:IStream Data。設備支持哪種傳輸方式,須在CWIADevice::BuildSupportedForms中指定,它是在初始化調用drvInitializeWia時調用的。如果使用In-memory傳輸,只需要將收到的掃描數據依次放入內存;如果使用FILE傳輸方式,還需要進行文件讀寫操作。傳輸時,內存空間是由PMINIDRV_TRANSFER_CONTEXT類型的參數指定的。首先需確定該參數是由WIA Sevice分配還是需要MiniDriver分配,確定方法是檢查MINIDRV_TRANSFER_CONTEXT中的參數 bClassDrvAllocBuf,當它為True時表示空間由 WIA Service分配,否則MiniDriver將在drvAcquireItemData開始時分配由另一個參數IBufferSzie指定大小的內存空間。
WIA MicroDriver主要是針對大部分Flatbed掃描儀所設計的。因為多數Flatbed掃描儀控制邏輯相近,參數相差無幾,故而微軟公司在其上層提供了一個MiniDriver,用其管理IHV提供的MicroDriver。
MicroDriver的體系結構中的WIA Flated Driver就是系統提供的MiniDriver,Microdriver就是我們要實現的MicroDriver。這兩者之間的通訊由3個函數來實現:MicroEntry,Scan以及 SetPixelWindow。 其中,MicroEntry實現了大部分的MicroDriver的控制操作。
當用戶改變掃描區域時,WIA Flated Driver會調用SetPixelWindow來通知MicroDriver,當用戶確定掃描參數開始掃描時,WIA Flated Driver會調用Scan來實現掃描操作。其流程如圖3所示。

圖3 MicroDriver的掃描流程Fig.3 Scanning process of MicroDrive
Scan是同Low Level Driver通訊的橋梁,它需要確定設備的狀態,下達掃描參數然后讀取掃描數據,結束時會發送指令以通知掃描結束。
文件傳輸時,會先傳入文件頭。以位圖為例,
位圖的坐標是以下方為起點,而掃描儀正好相反。
如果是True Color,首先會傳入54Bytes的Bitmap File Header和Bitmap Info Header。如果不做處理的將收到的數據存入Transfer Buffer中,那么最終掃描得到的圖像將是上下顛倒的。
將bmImageHeight乘以-1可以較好地解決這一問題。關鍵實
現代碼如下:
if(lScanPhase==SCAN_START){
BITMAPINFOHEAADER UNALIGNED*pBMPInfoHeader=( BITMAPINFOHEAADER*)
(pmdtc->pTransferBuffer+14);
pBMPInfoHeader->biHeight=0- pBMPInfoHeader->biHeight;}
hr=wiasWriteBufToFile(0,pmdtc);
MiniDriver可以通過以下方式判斷用戶選定
的是Flated還是ADF。
LONG lDocHandingSelect=0;
hr =wiasReadPropLong (pRootItemCtx,
WIA_DPS_DOCUMENT_HANDLING_SELECT,&lDocHandingSelect,NULL,FALSE);
代碼執行完后如果lDocHandingSelect的值為1表示為ADF,為2表示Flated。之后在drvAcquireItemData中可加入多項ADF的控制操作,如檢測是否有紙等。
MicroDriver受到WIA Flatbed driver的制約,但是它也可實現簡單的ADF控制。MicroDriver要維護一個SCANINFO的結構,其中有3個LONG型的成員,分別是:ADF,TPA和Endorser[6]。其中ADF的值為0表示掃描儀不支持ADF;為1表示支持ADF;為2表示雙面ADF。當設定支持ADF后,還需在MicroEntry加入MicroDriver的Antomatic Document Feeder Commands的支持。值得說明的是,MicroDriver雖然支持ADF,但是ADF所支持的掃描紙張大小必須和Flated相同,也即SCANINFO中的BedWidth和BedHeight的值。同時用戶也無權設置Contrast和Indesity的范圍。如果用戶希望控制這些特性,則須實現新的MiniDriver。
WIA是Windows下掃描儀獲取圖像常用方式之一。本文對實現過程中一些典型問題的分析也有助于開發者更好地解決問題。本文以掃描儀為例講述了WIA的實現,對于其他設備獲取圖像技術如相機的WIA實現也具有重要的參考意義。
[1]鐘昌樂,王博.基于WIA的圖像采集接口技術的應用[J].現代計算機,2008(9):142-144.ZHONG Chang-le,WANG Bo.Application of interface technology of image acquisition based on WIA[J].Modern Computer,2008(9):142-144.
[2]鐘承,代潔,肖江文.基于低壓電流互感器自動檢定線的掃描儀驅動[J].計算機與數字工程,2013,41(3):484-487.ZHONG Cheng,DAI Jie,XIAO Jiang-wen.Scanner drive of auto verification system based on low-voltage current transformer[J].Computer and Digital Engineering,2013,41(3):484-487.
[3]盧佩斯,趙國安.基于終端-服務器模式的掃描儀圖像獲取技術[J].計算機技術與發展,2010,20(3):28-31.LU Pei-si,ZHAO Guo-an.Design of image transmission from scanner under terminal-server[J].Computer Technology and Development,2010,20(3):28-31.
[4]Microsoft Inc.Windows Image Acquisition Drivers[EB/OL].[2014-01-01].http://msdn.microsoft.com/en-us/library/ff551467(v=vs.85).aspx.
[5]王恒升,匡洋,彭宏道.USB HID類設備小驅動程序開發[J].控制工程,2010,17(6):815-819.WANG Heng-sheng,KUANG Yang,PENG Hong-dao.Development of USB HID minidriver[J].Control Engineering of China,2010,17(6):815-819.
[6]尹東,王巍.TWAIN的原理及其應用開發 [J].信息技術,2001(9):15-16.YIN Dong,WANG Wei.Principle and application of TWAIN[J].Information Technology,2001(9):15-16.