翁省輝,喻武龍,鄧世強(qiáng)
(北京理工大學(xué) 珠海學(xué)院,廣東 珠海 519085)
WIA是Windows image acquisition的簡(jiǎn)稱(chēng),當(dāng)前可用版本是 WIA 2.0。 它是 Windows Millennium Edition(Windows Me)或者更高版本的 Windows系統(tǒng)中提供的數(shù)字圖像獲取服務(wù)[1]。它是Windows系統(tǒng)中掃描儀獲取圖像的常用方式之一[2]。
WIA是使用進(jìn)程外(out of process)服務(wù)實(shí)現(xiàn)的 com組件,和大多數(shù)進(jìn)程外服務(wù)程序不同的是,WIA通過(guò)提供自己的數(shù)據(jù)傳送機(jī)制(iwiadatatransfer接口),避免了圖像數(shù)據(jù)傳送過(guò)程中的性能損失[3]。
WIA的體系結(jié)構(gòu)如圖1所示[4]。
WIA整體分為三層,由上而下分別是UI層,服務(wù)層以及驅(qū)動(dòng)層。UI層與服務(wù)層之間主要通過(guò)COM Interface聯(lián)系,而服務(wù)與驅(qū)動(dòng)層則主要通過(guò)Win32 API聯(lián)系。驅(qū)動(dòng)層可理解為系統(tǒng)的USBSCAN.SYS;中間的服務(wù)層為User Mode的動(dòng)態(tài)庫(kù)文 件, 它 通 過(guò) CreateFile,ReadFile,WriteFile和 Device IOControl來(lái)實(shí)現(xiàn)與設(shè)備進(jìn)行通訊。
圖1 WIA的體系結(jié)構(gòu)Fig.1 Architecture of WIA
WIA Driver實(shí)際實(shí)現(xiàn)中分為兩種:MiniDriver,MiniDriver。本文將分別介紹它們的實(shí)現(xiàn)。
MiniDriver分為兩個(gè)層次:WIA Service InterfaceLayer和Device Communication Layer, 其 中 Device Communication Layer就是 Low-Level driver,而 WIA Service InterfaceLayer則是實(shí)現(xiàn)的重點(diǎn)。
MicroDriver僅以動(dòng)態(tài)庫(kù)形式實(shí)現(xiàn)3個(gè)接口函數(shù),而MiniDriver則不同,它必須以COM Interface的形式實(shí)現(xiàn)。
MiniDriver有一個(gè)很重要的概念:Root Item和Child Item。Root Item代表設(shè)備本身,Child Item可視為設(shè)備支持的屬性,例如掃描儀支持TPA,Endorse,則它們可以被視為一個(gè)Child Item。MiniDriver初始化時(shí)需要首先創(chuàng)建Root Item的屬性,然后依次創(chuàng)建Child Item的屬性[5]。
MiniDriver在一開(kāi)始初始化首先調(diào)用drvInitializeWia,須依次創(chuàng)建設(shè)備的Properties。
首先需要組織當(dāng)前設(shè)備的特性資料,比如支持的數(shù)據(jù)格式(True Color之類(lèi))、數(shù)據(jù)傳輸方式、壓縮模式以及解析范圍等。然后調(diào)用drvInitItemProperties來(lái)初始化Child Item的Capabilities及 Properties。
初始化完成之后,便可以接受用戶(hù)的設(shè)定了,諸如掃描區(qū)域、色彩類(lèi)型以及分辨率等。它主要是通過(guò)drv Write Properties來(lái)實(shí)現(xiàn)的,如圖2所示。
圖2 drvWriteProperties的操作示意圖Fig.2 Diagram of WriteProperties
然后是取得不同的參數(shù),需要定義這樣一個(gè)數(shù)據(jù):
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},
}
這個(gè)數(shù)據(jù)用來(lái)存儲(chǔ)類(lèi)型ID和將要獲取的掃描參數(shù),通過(guò)調(diào)用wiasReadMutitipe來(lái)獲取值,由此可獲得掃描參數(shù)。
得到掃描參數(shù)后,便進(jìn)入到數(shù)據(jù)傳輸階段了。Vista之前的系統(tǒng)有兩種方式:In-memory和File,Vista系統(tǒng)新增了一種方式:IStream Data。設(shè)備支持哪種傳輸方式,須在CWIADevice::BuildSupportedForms中指定,它是在初始化調(diào)用drvInitializeWia時(shí)調(diào)用的。如果使用In-memory傳輸,只需要將收到的掃描數(shù)據(jù)依次放入內(nèi)存;如果使用FILE傳輸方式,還需要進(jìn)行文件讀寫(xiě)操作。傳輸時(shí),內(nèi)存空間是由PMINIDRV_TRANSFER_CONTEXT類(lèi)型的參數(shù)指定的。首先需確定該參數(shù)是由WIA Sevice分配還是需要MiniDriver分配,確定方法是檢查MINIDRV_TRANSFER_CONTEXT中的參數(shù) bClassDrvAllocBuf,當(dāng)它為T(mén)rue時(shí)表示空間由 WIA Service分配,否則MiniDriver將在drvAcquireItemData開(kāi)始時(shí)分配由另一個(gè)參數(shù)IBufferSzie指定大小的內(nèi)存空間。
WIA MicroDriver主要是針對(duì)大部分Flatbed掃描儀所設(shè)計(jì)的。因?yàn)槎鄶?shù)Flatbed掃描儀控制邏輯相近,參數(shù)相差無(wú)幾,故而微軟公司在其上層提供了一個(gè)MiniDriver,用其管理IHV提供的MicroDriver。
MicroDriver的體系結(jié)構(gòu)中的WIA Flated Driver就是系統(tǒng)提供的MiniDriver,Microdriver就是我們要實(shí)現(xiàn)的MicroDriver。這兩者之間的通訊由3個(gè)函數(shù)來(lái)實(shí)現(xiàn):MicroEntry,Scan以及 SetPixelWindow。 其中,MicroEntry實(shí)現(xiàn)了大部分的MicroDriver的控制操作。
當(dāng)用戶(hù)改變掃描區(qū)域時(shí),WIA Flated Driver會(huì)調(diào)用SetPixelWindow來(lái)通知MicroDriver,當(dāng)用戶(hù)確定掃描參數(shù)開(kāi)始掃描時(shí),WIA Flated Driver會(huì)調(diào)用Scan來(lái)實(shí)現(xiàn)掃描操作。其流程如圖3所示。
圖3 MicroDriver的掃描流程Fig.3 Scanning process of MicroDrive
Scan是同Low Level Driver通訊的橋梁,它需要確定設(shè)備的狀態(tài),下達(dá)掃描參數(shù)然后讀取掃描數(shù)據(jù),結(jié)束時(shí)會(huì)發(fā)送指令以通知掃描結(jié)束。
文件傳輸時(shí),會(huì)先傳入文件頭。以位圖為例,
位圖的坐標(biāo)是以下方為起點(diǎn),而掃描儀正好相反。
如果是True Color,首先會(huì)傳入54Bytes的Bitmap File Header和Bitmap Info Header。如果不做處理的將收到的數(shù)據(jù)存入Transfer Buffer中,那么最終掃描得到的圖像將是上下顛倒的。
將bmImageHeight乘以-1可以較好地解決這一問(wèn)題。關(guān)鍵實(shí)
現(xiàn)代碼如下:
if(lScanPhase==SCAN_START){
BITMAPINFOHEAADER UNALIGNED*pBMPInfoHeader=( BITMAPINFOHEAADER*)
(pmdtc->pTransferBuffer+14);
pBMPInfoHeader->biHeight=0- pBMPInfoHeader->biHeight;}
hr=wiasWriteBufToFile(0,pmdtc);
MiniDriver可以通過(guò)以下方式判斷用戶(hù)選定
的是Flated還是ADF。
LONG lDocHandingSelect=0;
hr =wiasReadPropLong (pRootItemCtx,
WIA_DPS_DOCUMENT_HANDLING_SELECT,&lDocHandingSelect,NULL,F(xiàn)ALSE);
代碼執(zhí)行完后如果lDocHandingSelect的值為1表示為ADF,為2表示Flated。之后在drvAcquireItemData中可加入多項(xiàng)ADF的控制操作,如檢測(cè)是否有紙等。
MicroDriver受到WIA Flatbed driver的制約,但是它也可實(shí)現(xiàn)簡(jiǎn)單的ADF控制。MicroDriver要維護(hù)一個(gè)SCANINFO的結(jié)構(gòu),其中有3個(gè)LONG型的成員,分別是:ADF,TPA和Endorser[6]。其中ADF的值為0表示掃描儀不支持ADF;為1表示支持ADF;為2表示雙面ADF。當(dāng)設(shè)定支持ADF后,還需在MicroEntry加入MicroDriver的Antomatic Document Feeder Commands的支持。值得說(shuō)明的是,MicroDriver雖然支持ADF,但是ADF所支持的掃描紙張大小必須和Flated相同,也即SCANINFO中的BedWidth和BedHeight的值。同時(shí)用戶(hù)也無(wú)權(quán)設(shè)置Contrast和Indesity的范圍。如果用戶(hù)希望控制這些特性,則須實(shí)現(xiàn)新的MiniDriver。
WIA是Windows下掃描儀獲取圖像常用方式之一。本文對(duì)實(shí)現(xiàn)過(guò)程中一些典型問(wèn)題的分析也有助于開(kāi)發(fā)者更好地解決問(wèn)題。本文以?huà)呙鑳x為例講述了WIA的實(shí)現(xiàn),對(duì)于其他設(shè)備獲取圖像技術(shù)如相機(jī)的WIA實(shí)現(xiàn)也具有重要的參考意義。
[1]鐘昌樂(lè),王博.基于WIA的圖像采集接口技術(shù)的應(yīng)用[J].現(xiàn)代計(jì)算機(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]鐘承,代潔,肖江文.基于低壓電流互感器自動(dòng)檢定線(xiàn)的掃描儀驅(qū)動(dòng)[J].計(jì)算機(jī)與數(shù)字工程,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]盧佩斯,趙國(guó)安.基于終端-服務(wù)器模式的掃描儀圖像獲取技術(shù)[J].計(jì)算機(jī)技術(shù)與發(fā)展,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類(lèi)設(shè)備小驅(qū)動(dòng)程序開(kāi)發(fā)[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的原理及其應(yīng)用開(kāi)發(fā) [J].信息技術(shù),2001(9):15-16.YIN Dong,WANG Wei.Principle and application of TWAIN[J].Information Technology,2001(9):15-16.