从 TWAIN 设备中扫描图像Word文档下载推荐.docx

上传人:b****4 文档编号:7033396 上传时间:2023-05-07 格式:DOCX 页数:21 大小:26.28KB
下载 相关 举报
从 TWAIN 设备中扫描图像Word文档下载推荐.docx_第1页
第1页 / 共21页
从 TWAIN 设备中扫描图像Word文档下载推荐.docx_第2页
第2页 / 共21页
从 TWAIN 设备中扫描图像Word文档下载推荐.docx_第3页
第3页 / 共21页
从 TWAIN 设备中扫描图像Word文档下载推荐.docx_第4页
第4页 / 共21页
从 TWAIN 设备中扫描图像Word文档下载推荐.docx_第5页
第5页 / 共21页
从 TWAIN 设备中扫描图像Word文档下载推荐.docx_第6页
第6页 / 共21页
从 TWAIN 设备中扫描图像Word文档下载推荐.docx_第7页
第7页 / 共21页
从 TWAIN 设备中扫描图像Word文档下载推荐.docx_第8页
第8页 / 共21页
从 TWAIN 设备中扫描图像Word文档下载推荐.docx_第9页
第9页 / 共21页
从 TWAIN 设备中扫描图像Word文档下载推荐.docx_第10页
第10页 / 共21页
从 TWAIN 设备中扫描图像Word文档下载推荐.docx_第11页
第11页 / 共21页
从 TWAIN 设备中扫描图像Word文档下载推荐.docx_第12页
第12页 / 共21页
从 TWAIN 设备中扫描图像Word文档下载推荐.docx_第13页
第13页 / 共21页
从 TWAIN 设备中扫描图像Word文档下载推荐.docx_第14页
第14页 / 共21页
从 TWAIN 设备中扫描图像Word文档下载推荐.docx_第15页
第15页 / 共21页
从 TWAIN 设备中扫描图像Word文档下载推荐.docx_第16页
第16页 / 共21页
从 TWAIN 设备中扫描图像Word文档下载推荐.docx_第17页
第17页 / 共21页
从 TWAIN 设备中扫描图像Word文档下载推荐.docx_第18页
第18页 / 共21页
从 TWAIN 设备中扫描图像Word文档下载推荐.docx_第19页
第19页 / 共21页
从 TWAIN 设备中扫描图像Word文档下载推荐.docx_第20页
第20页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

从 TWAIN 设备中扫描图像Word文档下载推荐.docx

《从 TWAIN 设备中扫描图像Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《从 TWAIN 设备中扫描图像Word文档下载推荐.docx(21页珍藏版)》请在冰点文库上搜索。

从 TWAIN 设备中扫描图像Word文档下载推荐.docx

因为一个系统中可能存在多个TWAIN设备,因此必须选择一个数据源。

选择数据源通常有两种方式:

选择默认数据源(MSG_GETDEFAULT)和显示选择数据源对话框,由用户来选择数据源(MSG_USERSELECT)。

3.打开DS

使用MSG_OPENDS消息打开数据源。

4.设置参数

消息为MSG_SET,设置各种参数,如获取方式、图像数量等。

有些参数由设备驱动支持才有效。

5.显示扫描界面

使用MSG_ENABLEDS消息,显示设备驱动提供的用户界面(UI)。

6.获取图像

如果用户选择扫描什么的,可以在窗口的消息循环中获取到这个事件(MSG_XFERREADY)。

此时,应用程序可以通过DAT_SETUPFILEXFER设置文件名,然后用DAT_IMAGEFILEXFER获取图像到文件中。

7.关闭扫描界面

在窗口的消息循环中获取到MSG_CLOSEDSREQ或MSG_CLOSEDSOK消息,可以关闭扫描界面(MSG_DISABLEDS)。

8.关闭DS

消息为MSG_CLOSEDS。

9.关闭数据源

消息为MSG_CLOSEDSM。

三、CTwainHelper助手类

为了使用方便,我写了一个静态TWAIN助手类CTwainHelper。

使用CTwainHelper的五个函数,就可以简单地从TWAIN设备获取图像到文件中。

使用方法如下:

1.调用CTwainHelper:

:

Initialize()确定是否有可用的设备。

2.在窗口消息循环中,调用CTwainHelper:

ProcessMessage()处理TWAIN消息。

3.要获取图像时,调用CTwainHelper:

GetImage()。

4.如果图像已准备好(如用户确定扫描图像),窗口会收到WM_COMMAND消息,wParam为IDC_TwainHelper。

此时应用程序可以调用CTwainHelper:

TransferImage()获取图像到文件中。

具体使用方法请参看示例代码。

CTwainHelper可以在VisualC++6.x/7.x工程中使用,支持UNICODE编译。

因为是静态类,要改写成C代码只需要做一点点少量的工作。

四、后话

当然,上面只是一种常用的步骤。

其实应用程序完全可以自定义所有的步骤,比如不使用TWAIN驱动提供扫描对话框而直接扫描,或者扫描图像到内存中等等。

详细情况请参考TWAINSpecification,步骤大同小异,消息和参数千差万别,仔细看看应该很容易的。

如果没有TWAIN设备又要进行TWAIN程序开发,可以到TWAIN官方网站下载TWAINDevelopersToolkit,安装后会有一个虚拟的TWAIN设备。

不过应用程序在这个虚拟TWAIN设备中正常工作,不代表一定能在实际的TWAIN设备正常使用,这点需要注意。

以前CTwainHelper就碰到过这样的情况在虚拟TWAIN设备中明明是好的,在我的扫描仪上却不能扫描图像。

检查后发现,原来设置了不支持的参数。

最后,TWAIN是TechnologyWithoutAInterestingName缩写,直译为没有“没有让人感兴趣名字的技术”,真是一个让人摸不着头脑的名字。

TWAIN助手类:

CTwainHelper 

(包含示例代码35K)

TWAIN官方网站:

//www.twain.org

TWAIN头文件:

//www.twain.org/devfiles/twain.h

TWAINSpecification:

//www.twain.org/docs/Spec1_9_197.pdf

TWAINDevelopersToolkit:

//www.twain.org/devfiles/twainkit.exe

[2006.2.22]下面是更简单的版本,其中的GetImage函数内部自动具有消息循环,直到TWAIN对话框完全关闭后才会返回,适合任何场合使用:

下载文件

点击这里下载文件

转Twain学习 

2009-05-0311:

34:

07| 

分类:

C语言学习|字号 

订阅

一、TWAIN的文件组成

TWAIN共包括4个二进制文件。

如果要使用该接口,就必须要保证他们被成功地安装在本地计算机上。

文件名

说明

TWAIN_32.DLL

32位应用程序的支持文件,32位程序使用TWAIN通讯必须使用该文件。

TWAIN.DLL

16位应用程序的支持文件,16位程序使用TWAIN通讯必须使用该文件。

TWUNKER_32.EXE

实现32位应用程序与32位数据源进行通讯,它运行时不可见。

TWUNKER_16.EXE

实现32位应用程序与16位数据源进行通讯,它运行时不可见。

注意:

在WindowsNT环境下16位数据源不能够正常工作。

在Windows 

操作系统中(Windows9x/2000/XP),Microsoft已经把这些文件作为系统文件随同操作系统一起发布了。

你可以在Windows安装目录中查找到这些文件。

如果我们要编程来实现对TWAIvN的访问,还需要最重要的头文件。

你通过访问该http:

//www.twain.org/devfiles/twain.h 

地址来获得TWAIN提供的头文件。

二、TWAIN的结构

TWAIN依靠三个组件协同完成与图像设备的通讯和数据传输工作,这三个组件就是Application、Source 

Manager和Source。

组件

说明

Application

就是你要编写的应用程序。

SourceManager

是由TWAIN提供的一个Source的管理器,它不仅可以收集本地系统已经安装了的图像设备,还可以根据需要去加载设备。

同时,它最重要的功能是担任Application与Source通讯的桥梁。

(其实,它就是我们前面提到的组成文件中的dll文件。

Source

在这里可以看作是图像设备。

事实上它是由设备厂家提供的一个dll文件。

这个dll文件是支持twain接口的。

(该文不讨论关于twain在Source中的应用。

它们的层次结构图如下:

从该图我们可以看到,Application要从Source获得图像数据,必须通过SourceManager传递来实现。

Application与SourceManager间的通讯是靠调用TWAIN提供的DSM_Entry()函数实现。

而Application不能直接与Source通讯,SourceManager与Source间的通讯是靠调用TWAIN提供的DS_Entry()函数实现(在这里,我们不用关心SourceManager如何去调用DS_Entry函数。

三、TWAIN的用户界面

当我们使用TWAIN接口去获得图像数据的时候,会涉及到一些的用户界面,首先是我们的应用程序界面,然后是SourceManager提供的用户界面以及图像设备(Source)所提供的用户界面。

在我们的应用程序中,可以通过“选择设备”来打开SourceManager的标准用户界面。

SourceManager的界面由SourceManager提供。

在这个界面中可以让用户选择他想要使用的图像设备。

选中想要的设备后,再通过“获取…”来打开图像设备(Source)提供的用户界面进行现应的操作。

(注:

Source提供的界面会因为你使用的图像设备不同而有差异。

对于这些界面,TWAIN提供了非常灵活的处理方法。

对于SourceManager提供的用户界面以及图像设备(Source)所提供的用户界面,我们可以选择是否显示它们,甚至我们还可以按自己的要求去改写这些用户界面。

四、TWAIN的接口函数

要编写应用程序实现与支持TWAIN标准的图像设备通讯,只需要了解上面提到的DSM_Entry()接口函数。

TWAIN定义了大约140个操作消息。

你只要把这些消息通过DSM_Entry()函数发给SourceManager,就可以实现对选定的Source进行相应的操作。

SourceManager会分辨那些消息属于自己,那些消息是该转发给Source。

在介绍DSM_Entry()前,我们先来了解一下的TWAIN定义的消息格式。

TWAIN把它定义的操作称为Triplets操作,就是每个操作用三个定义的参数来表示。

这个三个参数用不同前缀名来区分。

每个Triplets操作都是唯一的,不会有歧意,它们代表一个特定的操作行为。

这三个参数类型分别是DataGroup(前缀名DG_)、DataArgument(前缀名DAT_)和MessageID(前缀名MSG_),每个参数都包含有各自的信息。

比如:

DG_CONTROL/DAT_PARENT/MSG_OPENDSM 

就表示一个打开SourceManager的操作,这些参数在TWAIN.H中都有定义。

其他的操作(设置扫描仪的分辨率、获得设备支持的功能等等…)你可以去查看TWAIN的参考手册,我将在后面编程应用中介绍几个最常用的操作。

现在,我们明白了TWAIN定义的Triplets操作,但是这还不够。

在使用DSM_Entry()前,必须要加载TWAIN_32.DLL文件以获得DSM_Entry()函数指针。

(注意:

在你程序中应该添加前面提到的TWAIN.H头文件哦!

DSMENTRYPROClpDSM_Entry;

//*DSM_Entry入口函数的指针

HMODULE 

hDSMDLL;

//*Twain_32.Dll句柄

……

//*加载TWAIN_32.DLL文件

if 

((hDSMDLL=LoadLibrary("

TWAIN_32.DLL"

))!

=NULL)

{

(hDSMDLL) 

//*检查TWAIN_32.DLL是否加载

((lpDSM_Entry=(DSMENTRYPROC)GetProcAddress(hDSMDLL,MAKEINTRESOURCE

(1)))!

=NULL)

//*成功获得DSM_Entry()函数指针;

}

现在我们明白了,TWAIN所有的操作都是通过DSM_Entry()函数来实现的,所以了解该入口函数很有必要。

它定义如下:

TW_UINT16FARPASCALDSM_Entry

(pTW_IDENTITYpOrigin, 

//*指向操作发起者的指针

pTW_IDENTITYpDest, 

//*指向目标对象的指针

TW_UINT32DG, 

//*Triplets操作的DG参数:

TW_UINT16DAT, 

//*Triplets操作的DAT参数:

TW_UINT16MSG, 

//*Triplets操作的MSG参数:

TW_MEMREFpData 

//*指向返回数据块的指针

其中DG、DAT、MSG参数表示一个你想执行的Triplets操作。

pOrigin表示发起Triplets操作的对象。

pDest表示接收Triplets操作的对象。

pData用于获得执行Triplets操作后返回的数据。

对于每个Triplets操作,都是由DG、DAT、MSG三个参数组合构成的。

pOrigin、pDest参数会根据不同的Triplets操作,而使用不同的值。

函数执行后会返回一个值来表示操作是否成功。

如果返回值为TWRC_SUCCESS表示操作成功,TWRC_FAILURE表示操作失败。

同样根据Triplets操作的类型不同,还会有其他的返回值。

比如TWRC_CANCEL、TWCC_LOWMEMORY…,具体信息你可以参考TWAIN的说明手册。

五、TWAIN的操作流程

Application、SourceManager和Source要实现数据传输,必须遵循一个操作流程。

你要进行的操作应该在这个流程规定的动作队列中按逻辑去执行。

比如,在没有加载SourceManager前,Application是不能要求Source传输数据的。

为了更好的去描述这个流程,TWAIN为该流程定义了7个状态(1-7)。

状态位 

1,2,3

这几个状态是用于描述SourceManager的,它们是SourceManager专有的状态位,所以SourceManager的标志位是不会大于3的.

状态位4,5,6,7

这几个状态是Source专有的。

如果Source打开了,Source的标志位就不会小于4;

如果Source关闭了,Source就没有了标志位。

要注意,我们的应用程序可以使用了多个Source,每个与Source的连接都是一个单独的会话,对于打开的每个Source,他们的标志位都是相互独立的,不互相关联。

现在就来看看流程图。

流程标志位说明

状态 

1–准备会话

在Application和SourceManager建立会话前,SourceManager的标志位是1.

在这个时候,SourceManager还没有被加载到内存中。

如果SourceManager被加载到内存中,则状态位是2或者3。

状态2–加载SourceManager

SourceManager现在已经被成功地加载到了程序中,但是没有打开SourceManager。

在这个时候,SourceManager开始准备去接受Application的Triplets操作。

状态3–打开SourceManager

SourceManager已经打开并且准备去管理Source.SourceManager现在准备向Source发送打开操作,去打开指定的Source,并等待所有针对Source的操作结束后,去关闭打开的Source.SourceManager在会话关闭前,状态位将保持为3.当Application打开的Source没有关闭时,SourceManager会拒绝关闭。

4–打开Source 

在响应Application的一个指定的Triplets操作后,Source被加载到系统中,并且被Sourcemanager打开。

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最常用的Triplets操作

这里将对TWAIN中最常用的Triplets操作做一个简单的介绍,为了便于理解和记忆,我将结合前面讲的操作流程顺序去介绍这些常用的Triplets操作。

1.加载SourceManager并获得DSM_Entry入口函数(状态1到2)

应用程序在调用DSM_Entry函数指针前必须加载SourceManager。

这里没有使用Triplets操作。

你可以使用LoadLibrary()函数,加载TWAIN_32.DLL文件。

并使用GetProcAddress()函数,获得DSM_Entry函数指针

2.打开SourceManager(状态2到3)

Triplets操作:

DG_CONTROL/DAT_PARENT/MSG_OPENDSM

通过该操作,你可以打开SourceManager,并且还要在你的应用程序中,指定一个窗体作为Source的父窗口。

SourceManager将通过该窗体,把Source的消息传递给你的应用程序。

3.选择Source(状态3期间)

DG_CONTROL/DAT_IDENTITY/MSG_USERSELECT

你的应用程序发送该操作后,将显示SourceManager的用户界面,它是一个对话框。

这个对话框中显示了系统中所有支持Twain的设备列表。

系统默认设备将高亮显示在列表框中。

你可以通过该列表框选择你想要的输入设备。

4.打开Source(状态3到4)

DG_CONTROL/DAT_IDENTITY/MSG_OPENDS

该操作可以打开你选择的Source(图像输入设备),同时,SourceManager会给该Source分配一个唯一的标识符。

你要把打开的这个Source放在一个指定的结构中,以便于在后面和该Source进行通讯。

5.设置Source的性能参数(状态4期间)

DG_CONTROL/DAT_CAPABILITY/MSG_GET

DG_CONTROL/DAT_CAPABILITY/MSG_SET

这里有两个Triplets操作,通过使用这两个操作可以去查询当前设备是否支持的某种功能,如果支持,还可以获得设备功能的当前值、默认值、以及可以重新设置的范围。

你还可以根据查询的结果,按你的要求去重新设置该功能的当前值。

6.请求从Source获取数据(状态4到5)

DG_CONTROL/DAT_USERINTERFACE/MSG_ENABLEDS

通过该操作,可以让Source显示它的用户界面,Source会去为数据传输作准备。

7.认数据准备传输(状态5到6)

DG_CONTROL/DAT_EVENT/MSG_PROCESSEVENT

首先要说明一下,从状态5到状态6的这个过程,不是由你的应用程序通过Triplets操作来发起的。

而是当Source准备好去传输数据时,它会发出一个事件信号来实现的。

你的应用程序应该要去检查这个事件信号。

如何去检查这个事件信号?

我们在加载SourceManager时,就为Source指定了一个父窗口,Source会把它事件信号封装成一个Windows的消息结构发送给它的父窗口。

你可以在这个窗体的消息循环中去,使用DG_CONTROL/DAT_EVENT/MSG_PROCESSEVENT操作,来判断Source是否有事件发生。

MSG_XFERREADY就表示这个过程的状态位从5变为6了。

8.开始进行数据传输(状态6到7)

DG_IMAGE/DAT_IMAGEINFO/MSG_GET 

DG_IMAGE/DAT_IMAGENATIVEXFER/MSG_GET

在开始数据传输前,可以通过 

DG_IMAGE/DAT_IMAGEINFO/MSG_GET操作,去获得将要传输的图像的相关信息,比如位图大小、宽度、长度…。

通过 

DG_IMAGE/DAT_IMAGENATIVEXFER/MSG_GET操作,可以实现使用本地传输模式去传输数据。

传输结束了,Source将给它的父窗口一个PM_XFERDONE的消息。

Source将在DSM_Entry()中返回为一个指向DIB位图

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2