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

转载于:https://www.cnblogs.com/myhw/p/8378546.html

TWAIN协议学习笔记相关推荐

  1. Servlet和HTTP请求协议-学习笔记02【Servlet_体系结构与urlpartten配置、HTTP请求协议】

    Java后端 学习路线 笔记汇总表[黑马程序员] Servlet和HTTP请求协议-学习笔记01[Servlet_快速入门-生命周期方法.Servlet_3.0注解配置.IDEA与tomcat相关配置 ...

  2. Servlet和HTTP请求协议-学习笔记01【Servlet_快速入门-生命周期方法、Servlet_3.0注解配置、IDEA与tomcat相关配置】

    Java后端 学习路线 笔记汇总表[黑马程序员] Servlet和HTTP请求协议-学习笔记01[Servlet_快速入门-生命周期方法.Servlet_3.0注解配置.IDEA与tomcat相关配置 ...

  3. POP3协议学习笔记

    今日得闲,于是将POP3的学习笔记也整理出来! 互联网上的TCP/IP,POP3/SMTP等资料多如牛毛,这里只是自己一点点心得,另外对于各位网络方面的大牛请安静的路过,我可不喜欢在关公面前耍大刀.. ...

  4. CoAP协议学习笔记 1.3 用UDP工具来调试CoAP

    1 前言 CoAP的调试,目前没找到好用的工具,网上说的火狐插件现在也不能用了,多希望手头的TCP/UDP网络调试工具就可以支持. 既然CoAP是基于UDP来组包的,那肯定是可以实现. 所以这篇文章给 ...

  5. 网络协议学习笔记 · 22

    IPv6 · 流媒体 · 即时通讯 · 缓存 · 网络爬虫 VPN 作用 VPN与代理的区别 实现原理(隧道协议) 网络爬虫 简易实例 robots.txt 无线网络 缓存(Cache) 响应头 请求 ...

  6. CoAP协议学习笔记 1.2 一张表了解 CoAP 协议

    1 前言 对于CoAP协议的学习,这份100多页的文档肯定没法背下来.我们只需把协议当作工具书,大体知道主体的内容,在遇到细节问题时再去具体章节找问题. 本篇笔记中先对 CoAP 协议内容做个基础了解 ...

  7. CoAP协议学习笔记 3.1 CoAP协议翻译 加密基础介绍

    CoAP协议学习笔记可点此查看. 1 前言 在之前的学习中,没有过多关注加密.但实际部分厂家的IoT平台(阿里云.OneNET)已经启用了相关安全处理,有必要深入学习下. 在 CoAP 协议 RFC7 ...

  8. BGP协议学习笔记——BGP基础

    BGP协议学习笔记--BGP基础(BGP概念.BGP报文.BGP状态机.BGP关系建立.BGP路由通告) 说明:本文学习笔记整理自网络.华为公开产品文档.华为公开PPT及部分的自我理解 一.BGP简介 ...

  9. 极客HTTP协议学习笔记破冰篇(1-7)

    极客HTTP协议学习笔记破冰篇(1-7) 前言 各篇章笔记链接 一.学习笔记 1.HTTP的前世今生 2.HTTP是什么 3.与HTTP相关的各种概念(上) 4.与HTTP相关的各种概念(下) 5.常 ...

最新文章

  1. MongoDB3.4安装及卸载
  2. JQuery Highcharts图表控件使用说明
  3. 优酷视频如何在手机进行安全设置?
  4. 【kafka】记一次线上kafka一直rebalance故障 消费慢 数据积压
  5. html dw map,DW十六 map标签
  6. 为什么有人说手机很少有白色的出现了?
  7. 蓝桥杯 BEGIN-4 入门训练 Fibonacci数列
  8. opencv 最大内接矩形_OpenCV之二值图像分析 – 寻找最大内接圆
  9. 器械传递的方法_天津304不锈钢传递窗报价_碧海云天
  10. Realtek显示芯片方案设计 RTD2270 RTD2281 RTD2513 RTD2525 RTD2556 RTD2785 RTD2795T 2796 VGA DVI HDMI DP转LVDS
  11. python量化股票源码_使用Python写一个量化股票提醒系统
  12. 详解c语言编程库题,详解C语言编程
  13. 《半小时漫画经济学》读书摘记
  14. 任务栏谷歌图标和其他图标重叠(如钉钉)的解决方法
  15. Android必知必会--NinePatch图片制作
  16. 申宝股票-抱团股继续杀跌
  17. 字体查看器,源码奉上
  18. DBUtils学习记录(传智播客视频)
  19. Mybatis错误总结
  20. 日常英语口语练习-情景交际场景25(三)

热门文章

  1. STL库容器vector at函数
  2. 让C++对象只能分配到堆/栈和静态区上并判断分配位置
  3. STL容器的线程安全
  4. 程序猿段子_【新年新气象】今年,能为程序员男友做点什么?
  5. 关于loader asyncTaskLoader AsyncTask的理解
  6. linux 日志按大小切割_日志切割工具logrotate,帮你管理你的日志文件
  7. 如何禁止网络爬虫频繁爬自己网站
  8. Clojure入门教程: Clojure – Functional Programming for the JVM中文版
  9. poi jxl 生成EXCEL 报表
  10. Eugeny and Array(水题,注意题目描述即可)