TWAIN学习笔记.docx

上传人:b****8 文档编号:30431950 上传时间:2023-08-15 格式:DOCX 页数:25 大小:31KB
下载 相关 举报
TWAIN学习笔记.docx_第1页
第1页 / 共25页
TWAIN学习笔记.docx_第2页
第2页 / 共25页
TWAIN学习笔记.docx_第3页
第3页 / 共25页
TWAIN学习笔记.docx_第4页
第4页 / 共25页
TWAIN学习笔记.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

TWAIN学习笔记.docx

《TWAIN学习笔记.docx》由会员分享,可在线阅读,更多相关《TWAIN学习笔记.docx(25页珍藏版)》请在冰豆网上搜索。

TWAIN学习笔记.docx

TWAIN学习笔记

TWAIN学习笔记

2008-10-06

TWAIN学习笔记(壹)

?

TWAIN,定义了一套标准的软件协议(softwareprotocol)和应用程序编程接口(applicationprogramminginterface(API))。

使用它实现软件应用程序和图象获取设备(扫描仪)之间的通讯。

我们见到的情况是:

从FILE菜单下选取ACQUIRE就弹出了扫描软件。

四层:

Application,Protocol,Acquisition,Device

用户层,用户的应用程序,界面之类的东西

?

协议层,把用户的请求转换成TWAIN明白的内容?

请求层,向下请求内容,可以是硬件也可以是数据库?

硬件层,数据的来源

?

TWAIN之间通讯通过两个入口,DSM_Entry,DS_Entry

Application:

所有的应用不能直连到数据层,只能通过SourceManager,通过DSM_Entry()方法。

DSM_Entry()方法有下面的参数:

标识符构造,identifierstructure?

目标(SourceManager或者Source)?

三个描述

o数据组(DataGroup:

DG_)oDataArgumentType(DAT_)oMessage(MSG_)

?

用于传数据的指针域

?

Win下,C代码类似于:

C代码

1.TW_UINT16FARPASCALDSM_Entry(

2.pTW_IDENTITYpOrigin,//sourceofmessage

3.pTW_IDENTITYpDest,//destinationofmessage4.TW_UINT32DG,//datagroupID:

DG_xxxx

5.TW_UINT16DAT,//dataargumenttype:

DAT_xxxx

6.TW_UINT16MSG,//messageID:

MSG_xxxx7.TW_MEMREFpData//pointertodata8.);

SourceManager:

SM提供应用层和数据层之间的通讯,支持用户选取数据源,应用层读取数据源。

如果用DSM_Entry()的时候,调用的是SM,那直接就操作它本身。

如果调用的是S,那再调用DS_Entry()。

Win下面,C代码类似于:

C代码

1.TW_UINT16FARPASCALDS_Entry(

2.pTW_IDENTITYpOrigin,//sourceofmessage

3.TW_UINT32DG,//datagroupID:

DG_xxxx4.TW_UINT16DAT,//dataargumenttype:

DAT_xxxx

5.TW_UINT16MSG,//messageID:

MSG_xxxx6.TW_MEMREFpData//pointertodata7.)Source:

返回值前缀TWRC_,如果出问题,设置一个前缀为TWCC_的状态码,但是不会自动返回。

SM和S在Win下都是DLL形式实现。

从Source返回给Application,需要4步:

通知应用层,已经准备好了有东西要返回了。

MSG_XFERREADY用于Source通知App

?

禁用Source的用户接口,MSG_CLOSEDSREQ

?

通知应用层,按下了OK按钮,应用更改,用于Source被DG_CONTROL/DAT_USERINTERFACE/MSG_ENABLEDSUIONLY.打开的情况,MSG_CLOSEDSOK?

设备发生动作,只有在应用层给数据层这个优先权,单独传回来。

MSG_DEVICEEVENT

?

DSM_Entry()和DS_Entry()用于通讯,一个操作和一个应用或者SM关联。

通常,但不绝对,用传进来的最后一个参数(pData)来描述。

从app到SM,设为NULL,从app到S(通过SM),设为目标id,从SM到S,设为DS_Entry。

传进来的三个参数DG,DAT,MSG表示的意思如下:

DG_XXXX:

DG_CONTROL用于TWAIN操作动作,例如打开SM?

DG_IMAGE用于操作图形图像操作?

DG_AUDIO用于操作声频数据

?

DAT_XXX:

传进来的参数,可以引用一个结构体或者变量,例如DAT_IDENTITY,还有类似于TW_XXX的声明。

MSG_XXX:

用于确定动作,都是类似于MSG_GET,MSG_SET的有前缀MSG_开始的。

三个例子:

打开SM模块:

DG_CONTROL/DAT_PARENT/MSG_OPENDSM打开对话框,让用户可以选择Source:

DG_CONTROL/DAT_IDENTITY/MSG_USERSELECT

导一个图像到文件上:

DG_IMAGE/DAT_IMAGEFILEXFER/MSG_GET

协议层被分为7个阶段:

[1,2,3]在且只在SM阶段,[4,5,6,7]在且只在S阶段。

举例说:

1.Pre-Session---->2.SMLoaded---->3.SMOpened---->4.SourceOpen---->

SMnotloadedApp:

GetEntrypointUser:

SelectSourceCapabilityNegotiation

5.SourceEnable---->6.TransferReady---->7.Transferring

Source:

ShowUserApp:

InquireImageSource:

TransferData

InterfaceorAudioInformation

看英文资料精疲力竭?

?

还阳中?

?

TWAIN学习笔记(贰)

TWAIN

能力分成三组:

?

CAP_XXX:

适用于一般的数据源?

ICAP_XXX:

适用于图形图像源?

ACAP_XXX:

适用于声音数据源

能力容器分成四类:

?

TW_ONEVALUE:

单值?

TW_ARRAY:

多值?

TW_RANGE:

范围值

?

TW_ENUMERATION:

枚举值

有三种方法将Source传递到应用程序。

native,diskfile,bufferedmemory。

音频文件只支持native和diskfile。

Native:

所有的Source都必须支持的模式,但是有限制性(例如限制于DIB或者PICT格式,受可用内存的限制),Win下,DIB格式(Device-IndependentBitmap),Source给文件分配一个内存块,将指针返回给应用,应用负责转换数据之后释放这块内存。

DiskFile:

推荐Source支持这种模式,应用程序创建一个Source支持格式的文件,易于读写,尤其是可以避免遇到内存问题。

稍微比之后讨论的Buffered模式慢,但比他好操作,并且之后应用程序要操作清理这个文件。

BufferedMemory:

所有的Source必须支持该模式。

MD,被关闭了,没保存。

通过一个或多个缓存来实现传输,应用层来分配内存的使用和释放。

数据以一无格式位图(unformattedbitmap)传输,应用需要在传输过程中

(TW_IMAGEINFO&TW_IMAGEMEMXFER)用信息标识各个缓存和正确识别位图。

于Native和DiskFile的一个动作结束传输相比,这种模式可能要多次循环。

应用层实现:

TWAIN的实现层次:

最小实现:

使用TWAIN默认的,只在Native本机模式,请求单独一个图片。

?

基本实现:

?

最大实现:

?

安装SM(SourceManager)软件:

TWAINWorkingGroup(TWG)给Win提供四个包:

TWAIN_32.DLL:

32位程序用?

TWAIN.DLL:

16位程序用

?

TWUNKER_32.EXE:

让16位应用程序链接32位的数据源

?

TWUNKER_16.EXE:

让32位应用程序链接16位源,注意,16位源不能再NT上面正确运行

?

SM四个文件Win文件夹下,比如C:

\\Winnt,C:

\\Windows.

微软提供了一个VER.DLL包,用于安装SM。

VER.DLL,VER.LIB,VER.H包括在安装包Toolkit里面。

VER.DLL是可以自由使用和发布的。

TWAIN要开始,要做三个准备:

添加应用的用户接口用来选择数据源和请求菜单选择:

必须有选择源(SelectSource...和Acquire...)

?

将TWAIN.H引用到程序中:

包括所有必须的定义

?

更改应用的事件循环:

可以开很多个源,但是每次只能持有一个。

o传递事件给Source

o通知应用,源准备好了或者关闭接口o硬件事件发生的时候通知应用。

?

三个目标的实现如下:

——————靠——————下面全都是具体实现,不想弄了。

——————靠——————算了,复制粘贴一下。

谁帮个忙。

第一个目标,传递事件(从应用到源):

只要源激活了,为了确保源能接受和执行事件,应用必须将所有事件,在源激活期间,统统传过去。

如:

DG_CONTROL/DAT_EVENT/MSG_PROCESSEVENTTW_EVENT结构如下:

C代码

1.typedefstruct{

2.TW_MEMREFpEvent;/*WindowspMSGorMACpEvent*/3.TW_UINT16TWMessage;/*TWmessagefromSourceto*/4./*theapplication*/

5.}TW_EVENT,FAR*pTW_EVENT;

pEvent在Win下,指向messagestructure。

源从SM接收到信息,决定是否属于它,

如果是:

源执行事件,然后设置返回码为TWRC_DSEVENT,以示它是Source事件,并且设置TW_Event结构的TWMessage到MSG_NULL,?

如果不是:

设置返回码为TWRC_NOTDSEVENT,设置TWMessage到MSG_NULL,应用从DSM_Entry接收到信息,然后在循环里面装作没事情一样执行。

?

第二和第三个目标,(从源到事件)

当源准备好了,通知应用,通过TW_EVENT.TWMessage,有下面四个选项:

MSG_XFERREADY:

标示数据已经准备好了?

MSG_CLOSEDSREQ:

关闭Source的用户接口

?

MSG_CLOSEDSOK:

同上,不过只用在DG_CONTROL/DAT_USERINTERFACE/MSG_ENABLEDSUIONLY

?

MSG_DEVICEEVENT:

报告设备事件发生

?

Win下,修改循环的例子代码:

C代码

1.TW_EVENTtwEvent;2.TW_INT16rc;

3.while(GetMessage((LPMSG)

pOrigin:

TW_IDENTITY,从应用和源链接上之后不能改变。

?

pDest:

如果操作最后目标是SM,设置为NULL,否则指向源

?

DG_XXX:

DG_CONTROL,DG_IMAGE,DG_AUDIO目前是被定义掉了的,可以自定义数据组。

?

DAT_XXX:

描述pData对象的唯一标示(结构或者变量)?

MSG_XXX:

动作的描述

?

pData:

操作用到的TW_XXX结构或者变量,类型有DAT_XXX描述。

?

TherearenineoperationtripletsthatcanbesentfromtheapplicationtobeconsumedbytheSourceManager.

有九个手术双胞胎,可发出的申请将消费源管理器。

从应用到SM,(我们公司的人事很有味道

),DG统统属于DG_CONTROL,DAT

有三个:

DAT_IDENTITY,DAT_PARENT,DAT_STATUS。

下面的列表是DAT下面的MSG组合:

DG_CONTROL/DAT_IDENTITYMSG_CLOSEDS:

MSG_GETDEFAULT:

MSG_GETFIRST:

MSG_GETNEXT:

MSG_OPENDS:

MSG_USERSELECT:

DG_CONTROL/DAT_PARENTMSG_CLOSEDSM:

MSG_OPENDSM:

DG_CONTROL/DAT_STATUSMSG_GET:

从应用到源:

参数通过DSM_Entry调用,第一个集是DG_CONTROL,定义了DG能在所有的TWAIN设备上运用的。

第二个集,定义为DG_IMAGE。

DG_CONTROL/DAT_CAPABILITYMSG_GETMSG_GETCURRENTMSG_GETDEFAULTMSG_RESET:

(能力值,扫描仪这类东西能干啥)获取能力值,包括当前的和默认的获取能力值当前值获取源的默认首选能力值

将当前源能力值转成TWAIN定义的默认值

准备关闭源

获取默认源的标识信息获取第一个活动源的标识信息获取下一个活动源的标识信息装载且初始化源弹出“选择源”的对话框

准备关闭SM初始化SM

返回SM当前状态码

MSG_SET:

DG_CONTROL/DAT_DEVICEEVENTMSG_GET:

DG_CONTROL/DAT_EVENTMSG_PROCESSEVENT:

DG_CONTROL/DAT_FILESYSTEMMSG_AUTOMATICCAPTUREDIRECTORY:

设定能力值

DG_CONTROL/DAT_NULL/MSG_DEVICEEVENT

从应用传递事件到源

选择目录自动接收图像

MSG_CHANGEDIRECTORY:

MSG_COPY:

MSG_CREATEDIRECTORY:

MSG_DELETE:

MSG_FORMATMEDIA:

MSG_GETCLOSEMSG_GETFIRSTFILEMSG_GETINFOMSG_RENAMEDG_CONTROL/DAT_PASSTHRU/MSG_PASSTHRUMSG_PASSTHRU

DG_CONTROL/DAT_PENDINGXFERSMSG_ENDXFERMSG_GETMSG_RESETMSG_STOPFEEDER

DG_CONTROL/DAT_SETUPFILEXFERMSG_GETMSG_GETDEFAULTMSG_RESETMSG_SET

DG_CONTROL/DAT_SETUPFILEXFER2MSG_GETMSG_GETDEFAULTMSG_RESETMSG_SET

DG_CONTROL/DAT_SETUPMEMXFERMSG_GET

更改当前domain,host,dir,设备拷贝文件

建立一个目录文件夹删除一个目录文件夹格式化存储设备(?

那么牛)关闭MSG_GETFILEFIRST打开的上下文获取目录里第一个文件获取当前文件上下文的信息重命名一文件

用特殊命令。

(无聊厂家提供的特殊功能)

应用接收或者请求结束数据传输返回源准备提供的传输重置强行停止ADF

返回文件的信息,文件将被源写入请求的数据

返回默认的文件传输信息重置当前文件信息为下一个文件传输设置信息

跟上面一样跟上面一样跟上面一样跟上面一样

返回源的最优,最小和最大的缓冲值

DG_CONTROL/DAT_STATUSMSG_GET

DG_CONTROL/DAT_USERINTERFACEMSG_DISABLEDSMSG_ENABLEDS

DG_CONTROL/DAT_XFERGROUPMSG_GET

从源返回当前状态码

关闭源的用户接口激活源的用户接口

给下面传输返回DG,目前支持DG_IMAGE或自定DG

上回说到从应用到源的三胞胎的第一组设置,现在说第二组DG_IMAGEDG_IMAGE/DAT_CIECOLORMSG_GET

DG_IMAGE/DAT_GRAYRESPONSEMSG_RESETMSG_SET

DG_IMAGE/DAT_IMAGEFILEXFERMSG_GET

DG_IMAGE/DAT_IMAGEINFOMSG_GET

DG_IMAGE/DAT_IMAGELAYOUTMSG_GETMSG_GETDEFAULTMSG_RESETMSG_SET

DG_IMAGE/DAT_IMAGEMEMXFERMSG_GETMSG_GETMSG_GETMSG_GETDEFAULTMSG_RESETMSG_SET

DG_IMAGE/DAT_PALETTE8MSG_GETMSG_GETDEFAULTMSG_RESETMSG_SET

给当前的传输返回CIEXYZ信息

灰度默认值设置灰度值

用DiskFile模式初始化图形图像请求

返回准备传输的图形图像的信息

给“原始”图像描述物理布局/位置获取图的默认布局信息

将下个图传输布局信息设成默认值设置下个图传输的布局信息

以缓存模式初始化图请求以本地模式初始化图请求获取当前传输的JPEG压缩参数获取默认的JPEG压缩参数使用源的默认JPEG压缩值使用指定的JPEG压缩值

获取当前传输信息获取源默认的调色板信息使用源默认的调色板使用指定的调色板

DG_IMAGE/DAT_IMAGENATIVEXFERDG_IMAGE/DAT_JPEGCOMPRESSION

DG_IMAGE/DAT_RGBRESPONSEMSG_RESETMSG_SET

DG_AUDIO/DAT_AUDIOFILEXFERMSG_GET:

DG_AUDIO/DAT_AUDIOINFOMSG_GET:

MSG_GET

使用默认的RGB值设定RGB值

文件(File)模式传音频数据

获取当前传输的信息(av的上半集)本地模式(Native)传输音频(audio)数据

DG_AUDIO/DAT_AUDIONATIVEXFER

以上说的是三胞胎(triplet,这个变态的翻译好记点,别学我),DG_XXX,DAT_XXX,MSG_XXX由上面的决定,剩下的几个补充如下:

pOrigin:

源,应用程序的TW_IDENTITY结构的副本

?

pDest:

如果操作对象是SM,值一定是NULL,如果是源,该参数引用源的TW_IDENTITY结构的一副本,返回给应用

?

pData:

由之前的DAT_XXX来定义是什么类型。

通常,对应的用TW_XXX来命名数据结构。

如:

DAT_IDENTITY对应的就是TW_XXX。

TWAIN.H里面定义了全部的结构。

应用负责所有的分配和释放以及检查。

?

{最短的一章,下面那个一个整体,实在对不起啊兄弟,委屈你太监了。

}

DIB(自XX百科)

C代码

1.DIB,全称DeviceIndependentBitmap,设备无关位图文件,这是一种文件格式,其目的是为了保证用某个应用程序创建的位图图形可以被其它应用程序装载或显示一样。

2.

3.DIB(Device-indepententbitmap)的与设备无关性主要体现在以下两个方面:

4.DIB的颜色模式与设备无关。

例如,一个256色的DIB即可以在真彩色显示模式下使用,也可以在16色模式下使用。

5.256色以下(包括256色)的DIB拥有自己的颜色表,像素的颜色独立于系统调色板。

6.由于DIB不依赖于具体设备,因此可以用来永久性地保存图象。

DIB一般是以*.BMP文件的形式保存在磁盘中的,有时也会保存在*.DIB文件中。

运行在不同输出设备下的应用程序可以通过DIB来交换图象。

7.DIB还可以用一种RLE算法来压缩图像数据,但一般来说DIB是不压缩的。

8.DIB的结构

9.与BorlandC++下的框架类库OWL不同,MFC未提供现成的类来封装DIB。

尽管Microsoft列出了一些理由,但没有DIB类确实给MFC用户带来很多不便。

用户要想使用DIB,首先应该了解DIB的结构。

10.在内存中,一个完整的DIB由两部分组成:

一个BITMAPINFO结构和一个存储像素阵列的数组。

BITMAPINFO描述了位图的大小,颜色模式和调色板等各种属性,其定义为

11.typedefstructtagBITMAPINFO{

12.BITMAPINFOHEADERbmiHeader;13.RGBQUADbmiColors[1];//颜色表14.}BITMAPINFO;

15.RGBQUAD结构用来描述颜色,其定义为16.typedefstructtagRGBQUAD{

17.BYTErgbBlue;//蓝色的强度18.BYTErgbGreen;//绿色的强度19.BYTErgbRed;//红色的强度

20.BYTErgbReserved;//保留字节,为021.}RGBQUAD;

22.注意,RGBQUAD结构中的颜色顺序是BGR,而不是平常的RGB。

23.BITMAPINFOHEADER结构包含了DIB的各种信息,其定义为24.typedefstructtagBITMAPINFOHEADER{

25.DWORDbiSize;//该结构的大小

26.LONGbiWidth;//位图的宽度(以像素为单位)27.LONGbiHeight;//位图的高度(以像素为单位)28.WORDbiPlanes;//必须为1

29.WORDbiBitCount//每个像素的位数(1、4、8、16、24或32)

30.DWORDbiCompression;//压缩方式,一般为0或BI_RGB(未压缩)

31.DWORDbiSizeImage;//以字节为单位的图象大小(仅用于压缩位图)

32.LONGbiXPelsPerMeter;//

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

当前位置:首页 > 职业教育 > 中职中专

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1