现在使用扫描仪、数码照相机、以及其他图像获得设备的应用越来越多了,用户越来越希望把这些获得的图像加入到自己的文件或其他工作中。然而,要显示并操作这些图像的光栅数据需要应用程序开发人员进行较大的工作。
一种比较简单的实现是通过是KODAK提供的控件,但是这种方法局限性太多,很多设备的功能都不能使用,比如设置设备扫描的分辨率,设置数据传输方式等等...(以扫描仪器为例子)。我将介绍利用TWAIN来实现对光栅图像输入设备(扫描仪、数码相机...)的控制,
谈谈TWAIN
TWAIN是什么?TWAIN Working Group 是一个致力于光栅图像输入设备通讯的非盈利的组织。Twain就是它们提供的开发包,并且大多数的设备厂家都遵循该接口。Microsoft也把该开发接口作为系统文件发布在了windows中(9x/nt/2000/xp)。
TWAIN 结构
它们由的三个软件组件构成( application, Source Manager, 和 Source.)
你的程序可以通过这些组件实现与设备的通讯。
TWAIN结构由下面四个层次组成:
ü Application
ü Protocol
ü Acquisition
ü Device
Application
这一层是用户可执行应用程序软件所在的地方。
TWAIN 提供了一个用户接口规则,可以让应用程序开发人员访问TWAIN函数以及让用户选择一个指定的数据Source.TWAIN不参与应用程序的实现工作。TWAIN不对该层由可能用到的应用程序间的通讯产生影响。
Protocol这个协议就是使用TWAIN对话的语法。它通过准确的指令实现数据传输的通讯工作。
这个协议层包括:
ü TWAIN 和用户应用程序接口
ü TWAIN提供的Source Manager
ü Source device 与 SourceManager 间的数据传输以及返回代码
该层更详细的说明将在后面的介绍。
Acquisition
Acquisition设备可能是物理设备(扫描仪、数码相机)或者逻辑设备(图像数据库)。Source为应用
程序传输数据。它使用这个格式在Source和Application间实现传输机制。
Source通常提供一个内建的用户接口去控制Source代表的设备。
Device
这层就不介绍了。
注意: 在appcation 和 Sources 间的通讯中,Protocol 层是最重要的。
TWAIN组件间通讯
TWAIN组件间通讯有两个函数指针入口,分别是DSM_Entry( ) 和 DS_Entry( ). DSM 表示 Data Source Manager , DS 表示 Data Source.
The ApplicationApplication的目的是为了从Source获得图像数据,然而,applications不能直接和Source对话。对Source所有操作(获得数据、性能信息、错误信息等…)必须通过Source Manager传递来实现。
在TWAIN中定义了大约140个操作消息。Application把这些消息发给Source Manager,以实现对选定的Source进行操作。
Application于Source Manager 通讯通过DSM_Entry( )函数实现。
DSM_Entry 函数参数列表内容:
l An identifier structure providing information about the application that originated the
function call
l 作用对象是 (Source Manager 或 Source)
l triplet操作描述。triplet 操作说明:
ü Data Group for the Operation (DG_ )
ü Data Argument Type for the Operation (DAT_ )
ü Message for the Operation (MSG_ )
l 指向传输数据的指针
这个函数会返回一个值来表示操作是否成功。
在C中,函数调用如下:
On Windows
TW_UINT16 FAR PASCAL DSM_Entry
( pTW_IDENTITY pOrigin, // 关于source 的信息;
pTW_IDENTITY pDest, // 消息目标
TW_UINT32 DG, // data group ID: DG_xxxx
TW_UINT16 DAT, // data argument type: DAT_xxxx
TW_UINT16 MSG, // message ID: MSG_xxxx
TW_MEMREF pData // 数据指针
);
Note: 数据类型定义在TWAIN.H 文件中。以后对其详细介绍。
The Source Manager
Source Manager 为application 和 Source间的通讯提供了桥梁。用户可以选择一个Source,并且Source Manager可以加载用户选中的这个Source,让Application去访问这个Source。
ü 如果DSM_Entry 函数目标是 Source Manager - Source Manager就自己处理这个操作。
ü 如果DSM_Entry 函数目标是 Source - Source Manager 就把操作信息的写入到参数列表中,并且在 destination 参数中写入指定的Source。为了把信息传递到Source, Source Manager将调用Source的DS_Entry( ) 函数。TWAIN规定,每个Source都要有DS_Entry 这个函数接口。
在C中,函数调用如下:
On WindowsTW_UINT16 FAR PASCAL DS_Entry
(pTW_IDENTITY pOrigin, // 关于source 的信息;
TW_UINT32 DG, // data group ID: DG_xxxx
TW_UINT16 DAT, // data argument type: DAT_xxxx
TW_UINT16 MSG, // message ID: MSG_xxxx
TW_MEMREF pData // 数据指针
);
另外,Source Manager可以不需要Application发起,就开始三个操作。这些操作仅仅存在Source Manager与 Source通讯的时候,并且要在SourceManager显示选择Source对话窗体时才能执行。这些操作用于:查找操作系统中可用的Source、打开Source、关闭Source.
On Windows
在Windows操作系统中, Source Manager 是一个动态连接库 (DLL).
Source Manager 可以同时管理多个Applications和多个Sources的会话. Source Manager的线程被多个应用程序共享。
The Source
Source不直接接受Application的操作,而是通过Source Manager中转。Source也可能直接接受Source Manager操作。Source接受这些操作后,通过返回代码(返回代码以TWRC_为前缀)传递给Source Manager来表示处理的操作结果。
如果操作的发起方是Application, 这个返回代码通过DSM_Entry( )函数的返回值,被传回给Application。
如果,操作没有成功,Source会把一些失败信息写入到一个标记代码中(以TWCC_为前缀),但是,Source不会自动把这个代码传递给Application。如果Appliaction要想得到这个信息必须要发出个操作请求,才能得到这些信息。
On Windows在Windows操作系统中, Source是一个动态连接库 (DLL).
后面我将陆续介绍。