TWAIN定义了图像设备(扫描仪,数码相机)和应用之间相互通信的协议,各个设备厂商通过支持TWAIN协议使得上层应用可以用同样的代码去访问不同扫描仪

TWAIN主要包括三个要素:

Application - 使用TWAIN的图像应用,如Photoshop,

Source Manager - 用来管理数据源和应用之间的交互,这个模块由TWAIN Group来维护,并提供开源代码(https://github.com/twain/twain-dsm)。windows提供默认实现TWAIN32.dll但是只支持到1.7版本,这个版本最早是存在于windows98 和NT5.0,直到今天也没升级过。 通常application或source安装时应该提供更新版本,下载最新代码编译后的版本号是2.4,最终二进制文件如下

Winddows:TWAINDSM.dll

Mac:Twain.framework

Linux:/usr/local/lib/libtwaindsm.so

Data Source - 主要用于控制图像设备,这块主要由硬件厂商开发,

 

 目前TWAIN协议最新版本号是2.4。对于TWAIN来说,版本2.0是个分水岭(于2010年制定),这个版本定义了图像设备允许支持windows,Mac,Linux,并可以允许在x86和x64位系统,目前来说很多硬件厂商都没有对TWAIN Source升级到2.x,所以一般来说应用程序遵循1.x标准也可以使用大多数扫描仪

通信接口

三个要素之间通信通过DSM_Entry()和DS_Entry()两个接口

开发TWAIN应用

应用程序无法之间操作source,所有对source的请求都是通过Source Manager完成DSM_Entry(),根据TWAIN协议推荐,所有的TWAIN命令调用最好在同一个线程完成

当应用使用TWAIN 1.x时,需要提供一个windows句柄接收source的事件

TW_UINT16 TW_CALLINGSTYLE DSM_Entry
( pTW_IDENTITY pOrigin, // source of message
pTW_IDENTITY pDest, // destination of message
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 // pointer to data
);

pOrigin - 应用程序信息

pDest - 目标信息,如果是Source Manager,是NULL,如果是Source,则为这个Source的Identity

DG- 操作数据组

DAT -操作数据类型

MSG-消息ID

其中DG/DAT/MSG称为twain的操作组

twain session

操作扫描仪需要在session内完成,每个TWAIN session包括7个状态,不同的状态使用不同操作组对source操作和状态转移,应用程序应该遵循状态对source进行操作。但TWAIN并不强制要求每个source按照state1到state7的步骤进行状态转移,比如很多程序在load sourcemanager(state 3)后暂停,然后重复state4-state7(重复选择扫描仪进行扫描)

  • State 1 to 2 -加载source manager 获取 DSM_Entry接口
  • State 2 to 3 - 打开source manager
  • State 3 - 选择 Source
  • State 3 to 4 - 打开 Source
  • State 4 - 设置source的capacity
  • State 4 to 5 - 请求从source获取数据
  • State 5 to 6 - 数据可以准备消息
  • State 6 to 7 - 开始数据传输
  • State 7 to 6 to 5 - 完成传输
  • State 5 to 1 - 断开连接

 

停止扫描两种方法

    1. MSG_STOPFEDDER -发送停止扫描命令,,扫描仪会将扫描过的图片发过来

    2. MSG_RESET -发送停止扫描命令,,扫描仪不会将扫描过的图片发过来,调完这个命令后,TWAIN状态将直接到SourceEnabled