TWAIN依靠三个组件协同完成与图像设备的通讯和数据传输工作,这三个组件就是Application、SourceManager和Source。
组件 | 说明 |
Application | 就是你要编写的应用程序。 |
Source Manager | 是由TWAIN提供的一个Source的管理器,它不仅可以收集本地系统已经安装了的图像设备,还可以根据需要去加载设备。同时,它最重要的功能是担任Application 与Source通讯的桥梁。 |
Source | 在这里可以看作是图像设备。事实上它是由设备厂家提供的一个dll文件。这个dll文件是支持TWAIN接口的。 |
状态机
TWAIN定义了7个状态:
状态1、2、3用于描述Source Manager的,它们是Source Manager专有的状态位。
状态4、5、6、7是Source专有的。如果Source打开了,Source 的标志位就不会小于4;如果Source关闭了,Source就没有了标志位。
- 状态 1 – 准备会话
在Application和Source Manager建立会话前,Source Manager的标志位是1.
在这个时候,Source Manager还没有被加载到内存中。如果Source Manager被加载到内存中,则状态位是2或者3。
- 状态2 –加载Source Manager
Source Manager现在已经被成功地加载到了程序中,但是没有打开Source Manager。
在这个时候,Source Manager开始准备去接受Application的Triplets操作。
- 状态3 – 打开Source Manager
Source Manager已经打开并且准备去管理Source.
Source Manager现在准备向Source发送打开操作,去打开指定的Source,并等待所有针对Source的操作结束后,去关闭打开的Source.
Source Manager在会话关闭前,状态位将保持为3.
当Application打开的Source没有关闭时,Source Manager 会拒绝关闭。
- 状态 4 – 打开Source
在响应Application的一个指定的Triplets操作后,Source被加载到系统中,并且被Source manager 打开。Source在加载前将检测是否有足够的系统资源让自己运行(内存、设备是否可用等等…)。 Application不仅可以查询Source的性能参数(当前解析度、是否支持彩色或黑白图像、自动文档传送是否可用), Application还可以去设置的Source的性能参数。比如 ,Application可以要求Source按指定的分辨率传输黑白图像。
注意: 可以在Source的状态位是4, 5, 6, 或 7时,去查询Source的性能参数。但是要想设置Source的性能参数必须在状态位是4的时候设置,除非Application和Source有特殊的约定,否则在标志位为其他数的时候都不可以进行性能参数设置。
- 状态 5 – Source可用
现在可以让Source工作了,此时Source开始为数据传输做准备。在该状态下,可以执行一个Triplets操作,用以选择是否让Source显示它自己的用户界面(Source提供的软件界面)。当Source准备好给Application传输数据时,标志位就从5变为6了。
- 状态 6 –准备数据传输
该状态下,Source已经准备好了为Application传输数据。在传输工作开始前,Application应该查询将要被传输的图像的相关信息(分辨率,图像大小…), 如果Source还要传输音频数据, 那么在传输图像数据前,Application必须要把所有的音频数据先传完。注:某些数码相机带有摄像功能,可以记录一些声音信息。
- 状态 7 –传输开始
Source开始进行数据传输,它把获得的数据传输给你的应用程序。
传输工作要么成功完成,要么提前中止。在传输工作完成后, Source将会发送一个返回代码去表示传输工作的最终结果。
数据传输模式
TWAIN定义了三种模式用于Source 到Application的数据传输:本地模式、文件模式,和缓存模式。
- 本地模式
所有的输入设备都支持这种本地数据传输模式,同时它也是TWAIN默认的数据传输模式,并且它还是最容易使用的数据传输模式。但是,它有一定的局限性,它传输的数据必须是DIB 图像数据,并且在传输时,会受到系统内存大小限制。
- 文件模式
该模式是让Application 创建一个文件,这个文件用于储存传输的数据,Source将对该文件进行读写操作。
- 缓存模式
缓存模式在整个传输过程中,将使用一个或多个内存缓存区,内存缓存区的分配和释放工作由Application来控制。在传输过程中,传输数据被当作一个未知格式的位图。Application必须使用TW_IMAGEINFO 和TW_IMAGEMEMXFER操作,去得到各个缓存区的信息并把它们正确组织为一个完整的位图。