10.断开应用程序和TWAIN的会话
在图像传输完成后,要断开应用程序和TWAIN的这个会话,使打开的Source失效。如果要进行下一次的图像传输,则要回到第6中重新开始请示数据传输或者回到5中重新设置性能参数。断开的Triplets 操作是:DG_CONTROL / DAT_USERINTERFACE / MSG_DISABLEDS,代码如下:
dsmentry(app,newds,DG_CONTROL,DAT_USERINTERFACE,MSG_disableDS,@k);
11.关闭Source 和Source Manager
当所有的操作完成之后,应用程序需要关闭已经打开的Source,然后再关闭Source Manager,这里要注意的是,如果你打开了多个Source的话,必须将它们全部关闭后,才可以关闭Source Manager。有关的Triplets 操作是:DG_CONTROL / DAT_IDENTITY / MSG_CLOSEDS(关闭指定的Source)和DG_CONTROL / DAT_PARENT/MSG_CLOSEDSM(关闭打开的Source Manager)。实现代码如下:
dsmentry(app,nil,DG_CONTROL, DAT_IDENTITY,MSG_closeds, TW_MEMREF(newds));
dsmentry(app,NiL,DG_CONTROL,DAT_PARENT,MSG_closeDSM,TW_MEMREF(newds) );
四、TWAIN的数据传输模式
TWAIN定义了三种数据传输模式:本地模式、文件模式和缓存模式。
1.本地模式
这是所有的输入设备都支持的数据传输模式,也是TWAIN默认的数据传输模式。在这种模式下传输的数据必须是DIB 图像数据。
使用该模式,在数据传输时Source分配一块单独的内存区域,并把图像数据写入这个内存区域内。然后它通过一个指向该内存地址的指针返回给应用程序。应用程序通过访问该内存区域去获得具体的图像数据。注意,应用程序在获得数据后要负责释放分配的内存,而且如果图像数据大于系统当前可用内存,会导致传输失败。
2.文件模式
该模式是让应用程序创建一个文件, Source将对该文件进行读写操作。Source把要传输的数据写到该文件中,应用程序通过访问该文件,就可以获得传输的数据。 在使用本地模式传输一个大的图像文件时,如果内存不够大,可以考虑使用文件传输模式来传输。
3.缓存模式
缓存模式在整个传输过程中,将使用一个或多个内存缓存区,内存缓存区的分配和释放工作由应用程序来控制。在传输过程中,传输数据被当作一个未知格式的位图。应用程序必须管理各个缓存区的信息并把它们正确组织为一个完整的位图。
五、应用实例
下面的实例只是一个基本的应用实现。本程序中选择默认的本地传输模式获取图像。在程序运行之前,如果当前系统中没有安装扫描仪,可以先安装TWAIN提供的Twainkit.exe工具,它可以在系统中安装一个虚拟的扫描仪设备,便于程序调试。
在Delphi6中新建一个工程,在Form1中添加一个按钮控件Button1、一个图像控件Image1和一个标签控件Label1。Button1的Caption设为“获取图像”,设计界面如图1所示。
在Button1的OnClick()事件中添加如下代码:
if loaddsm then
begin
isdsmopen:=opendsm;
if isdsmopen then
if selds then
begin
isdsopen:=opends;
if isdsopen then
begin
label1.Caption :='应用程序可接收的图片数量为:'+inttostr(getinfo);
enableds;
end;
end;
end;
六、结语
从上面的介绍可以看到,要在自己的应用程序中控制扫描仪并不难,只要按照TWAIN的规范和逻辑进行设计就可以轻松实现从扫描仪中获取图像的功能。当然本文所介绍的功能只是其中的一小部分,如果要了解更多的信息,可以访问其官方网站http://www.twain.org。本程序在WindowsXP/Delphi6环境下运行通过。
参考文献 TWAIN Working Group. http://www.twain.org/
|