APP下载

Windows下扫描仪WIA驱动的实现

2015-01-16翁省辉喻武龙邓世强

电子设计工程 2015年3期
关键词:传输方式体系结构扫描仪

翁省辉,喻武龙,邓世强

(北京理工大学 珠海学院,广东 珠海 519085)

WIA是Windows image acquisition的简称,当前可用版本是 WIA 2.0。 它是 Windows Millennium Edition(Windows Me)或者更高版本的 Windows系统中提供的数字图像获取服务[1]。它是Windows系统中扫描仪获取图像的常用方式之一[2]。

1 WIA的体系结构

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。本文将分别介绍它们的实现。

2 MiniDriver

2.1 MiniDriver的体系结构

MiniDriver分为两个层次:WIA Service InterfaceLayer和Device Communication Layer, 其 中 Device Communication Layer就是 Low-Level driver,而 WIA Service InterfaceLayer则是实现的重点。

2.2 MiniDriver的实现

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指定大小的内存空间。

3 MicroDriver

WIA MicroDriver主要是针对大部分Flatbed扫描仪所设计的。因为多数Flatbed扫描仪控制逻辑相近,参数相差无几,故而微软公司在其上层提供了一个MiniDriver,用其管理IHV提供的MicroDriver。

3.1 MicroDriver的体系结构

MicroDriver的体系结构中的WIA Flated Driver就是系统提供的MiniDriver,Microdriver就是我们要实现的MicroDriver。这两者之间的通讯由3个函数来实现:MicroEntry,Scan以及 SetPixelWindow。 其中,MicroEntry实现了大部分的MicroDriver的控制操作。

3.2 MicroDriver的实现

当用户改变扫描区域时,WIA Flated Driver会调用SetPixelWindow来通知MicroDriver,当用户确定扫描参数开始扫描时,WIA Flated Driver会调用Scan来实现扫描操作。其流程如图3所示。

图3 MicroDriver的扫描流程Fig.3 Scanning process of MicroDrive

Scan是同Low Level Driver通讯的桥梁,它需要确定设备的状态,下达扫描参数然后读取扫描数据,结束时会发送指令以通知扫描结束。

4 MiniDriver、MicroDriver实现中的关键问题

4.1 位图上下颠倒问题

文件传输时,会先传入文件头。以位图为例,

位图的坐标是以下方为起点,而扫描仪正好相反。

如果是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);

4.2 MiniDriver中ADF的控制

MiniDriver可以通过以下方式判断用户选定

的是Flated还是ADF。

LONG lDocHandingSelect=0;

hr =wiasReadPropLong (pRootItemCtx,

WIA_DPS_DOCUMENT_HANDLING_SELECT,&lDocHandingSelect,NULL,FALSE);

代码执行完后如果lDocHandingSelect的值为1表示为ADF,为2表示Flated。之后在drvAcquireItemData中可加入多项ADF的控制操作,如检测是否有纸等。

4.3 MicroDriver中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。

5 结束语

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.

猜你喜欢

传输方式体系结构扫描仪
三维扫描仪壳体加工工艺研究
可穿戴式多通道传感系统功能需求分析及设计
基于粒计算的武器装备体系结构超网络模型
作战体系结构稳定性突变分析
基于分布式传感器的GIS局部放电在线监测实时数据传输方式的研究
三维激光扫描仪在变形监测中的应用
基于DODAF的装备体系结构设计
基于云计算的航天器控制系统自组织体系结构
便携高速文件扫描仪
浅谈工程建设中的信息化发展与网络传输方式选择