从 TWAIN 设备中扫描图像
转自(http://yonsm.net/scan-images-from-a-twain-device/)
一、简介
TWAIN 数据源管理程序 (DSM) 工业标准的软件库,用于从静态图像设备提取图像。绝大部分的扫描仪和数码相机都提供了 TWAIN 驱动程序,利用统一的 TWAIN 接口,应用程序可以非常方便地从这些设备中获取图像。
二、使用步骤
互联网上关于 TWAIN 编程的中文资料很少,代码更是难找到,因为我不得不仔细阅读了 http://www.twain.org/ 提供的 TWAIN Specification。下面说说使用 TWAIN 接口获取图像的简要步骤。
Windows 系统中存在一个 TWAIN_32.dll,所有的 TWAIN 操作都是通过这个 DLL 导出的 DSM_Entry 函数来实现的 (说实在话,我个人觉得 TWAIN 接口设计得太差了,看看 MS 的WIA,逻辑上非常清晰)。这个函数的声明如下:
TW_UINT16 FAR PASCAL DSM_Entry(pTW_IDENTITY pOrigin, // Source of messagepTW_IDENTITY pDest, // Destination of messageTW_UINT32 DG, // Data group ID: DG_xxxxTW_UINT16 DAT, // Data argument type: DAT_xxxxTW_UINT16 MSG, // Message ID: MSG_xxxxTW_MEMREF pData // Pointer to data
);
- 打开 DSM (Data Source Manager: 数据源管理器)
TWAIN 是一个数据源管理程序,应用程序首先要使用 MSG_OPENDSM 消息,打开数据源管理器。这里需要指定一个窗口句柄,应用程序应该在此窗口的消息循环中处理 TWAIN 消息 (MSG_PROCESSEVENT)。
- 选择 DS (Data Source: 数据源)
因为一个系统中可能存在多个 TWAIN 设备,因此必须选择一个数据源。选择数据源通常有两种方式: 选择默认数据源 (MSG_GETDEFAULT) 和显示选择数据源对话框,由用户来选择数据源 (MSG_USERSELECT)。
- 打开 DS
使用 MSG_OPENDS 消息打开数据源。
- 设置参数
消息为 MSG_SET,设置各种参数,如获取方式、图像数量等。有些参数由设备驱动支持才有效。
- 显示扫描界面
使用 MSG_ENABLEDS 消息,显示设备驱动提供的用户界面 (UI)。
- 获取图像
如果用户选择扫描什么的,可以在窗口的消息循环中获取到这个事件 (MSG_XFERREADY)。此时,应用程序可以通过 DAT_SETUPFILEXFER 设置文件名,然后用 DAT_IMAGEFILEXFER 获取图像到文件中。
- 关闭扫描界面
在窗口的消息循环中获取到 MSG_CLOSEDSREQ 或 MSG_CLOSEDSOK 消息,可以关闭扫描界面 (MSG_DISABLEDS)。
- 关闭 DS
消息为 MSG_CLOSEDS。
- 关闭数据源
消息为 MSG_CLOSEDSM。
三、CTwainHelper 助手类
为了使用方便,我写了一个静态 TWAIN 助手类 CTwainHelper。使用 CTwainHelper 的五个函数,就可以简单地从 TWAIN 设备获取图像到文件中。使用方法如下:
- 调用 CTwainHelper::Initialize() 确定是否有可用的设备。
- 在窗口消息循环中,调用 CTwainHelper::ProcessMessage() 处理 TWAIN 消息。
- 要获取图像时,调用 CTwainHelper::GetImage()。
- 如果图像已准备好 (如用户确定扫描图像),窗口会收到 WM_COMMAND 消息,wParam 为 IDC_TwainHelper。此时应用程序可以调用 CTwainHelper::TransferImage() 获取图像到文件中。
具体使用方法请参看示例代码。
CTwainHelper 可以在 Visual C++ 6.x/7.x 工程中使用,支持 UNICODE 编译。因为是静态类,要改写成 C 代码只需要做一点点少量的工作。
四、后话
当然,上面只是一种常用的步骤。其实应用程序完全可以自定义所有的步骤,比如不使用 TWAIN 驱动提供扫描对话框而直接扫描,或者扫描图像到内存中等等。详细情况请参考 TWAIN Specification,步骤大同小异,消息和参数千差万别,仔细看看应该很容易的。
如果没有 TWAIN 设备又要进行 TWAIN 程序开发,可以到 TWAIN 官方网站下载 TWAIN Developers Toolkit,安装后会有一个虚拟的 TWAIN 设备。不过应用程序在这个虚拟 TWAIN 设备中正常工作,不代表一定能在实际的 TWAIN 设备正常使用,这点需要注意。以前 CTwainHelper 就碰到过这样的情况 在虚拟 TWAIN 设备中明明是好的,在我的扫描仪上却不能扫描图像。检查后发现,原来设置了不支持的参数。
最后,TWAIN 是 Technology Without A Interesting Name 缩写,直译为没有“没有让人感兴趣名字的技术”,真是一个让人摸不着头脑的名字。
TWAIN 助手类: CTwainHelper (包含示例代码 35K)
TWAIN 官方网站: http://www.twain.org
TWAIN 头文件: http://www.twain.org/devfiles/twain.h
TWAIN Specification: http://www.twain.org/docs/Spec1_9_197.pdf
TWAIN Developers Toolkit: http://www.twain.org/devfiles/twainkit.exe
[2006.2.22] 下面是更简单的版本,其中的 GetImage 函数内部自动具有消息循环,直到TWAIN对话框完全关闭后才会返回,适合任何场合使用:
转载于:https://www.cnblogs.com/FindSelf/p/5033364.html
从 TWAIN 设备中扫描图像相关推荐
- [原创]从 TWAIN 设备中扫描图像
一.简介 TWAIN 数据源管理程序 (DSM) 工业标准的软件库,用于从静态图像设备提取图像.绝大部分的扫描仪和数码相机都提供了 TWAIN 驱动程序,利用统一的 TWAIN 接口,应用程序可以非常 ...
- Powerbuilder中Kodak图像扫描控件应用技巧
Powerbuilder中Kodak图像扫描控件应用技巧 作者:佚名 减小字体 增大字体 摘 要 Powerbuilder中对Kodak图像扫描控件应用的技巧,主要是对扫描出来的图像进行文件头修 ...
- 网页扫描图像并以pdf格式上传到服务器端
本文描述如何通过网页驱动扫描仪.高拍仪等图像扫描设备进行图像扫描,扫描结果经编辑修改后以pdf压缩格式上传到后台java程序中进行服务器端落盘保存. 图像扫描上传如文字描述顺序所介绍,先要驱动扫描设备 ...
- OpenCV之core 模块. 核心功能(1)Mat - 基本图像容器 OpenCV如何扫描图像、利用查找表和计时 矩阵的掩码操作 使用OpenCV对两幅图像求和(求混合(blending))
Mat - 基本图像容器 目的 从真实世界中获取数字图像有很多方法,比如数码相机.扫描仪.CT或者磁共振成像.无论哪种方法,我们(人类)看到的是图像,而让数字设备来"看"的时候,则 ...
- android studio点击图片,如何在Android Studio中的模拟器图库中添加图像?
如何在Android Studio中的模拟器图库中添加图像? 我正在开发图像过滤器应用程序. 但是,如果我没有任何图像,就无法真正尝试. 我知道我可以在电话中对其进行测试,但这并不相同,因为我需要错误 ...
- 医学数字成像设备中计算机系统的作用包括,医学影像实用技术教程全部习题答案...
--------------------------------------------------正文内容开始-------------------------------------------- ...
- 无人驾驶环境感知设备中 激光雷达和摄像头各自的优缺点
无人驾驶环境感知设备中 激光雷达和摄像头各自的优缺点 目前,国外和国内做激光雷达的厂商并不多.比如 Velodyne 推出 16 线.32 线. 64 线和128线激光雷达产品.Quanergy 早期 ...
- 解析骁龙移动平台在AR设备中的应用实践
在过去的一年里,VR/AR 得到了大幅度的商业化应用,无论是经久不衰的科技巨头,或初涉该领域的初创企业,都频频出招.在各式 VR/AR SDK 面世并得到广泛运营的同时,我们看到了诸多平台.开发团队产 ...
- 如何获得高质量的扫描图像
扫描过程从来都是简单的,但是要得到高质量的扫描图像,则涉及到太多的可变因素,因为彩色桌面系统本身就是开放性的.结合长时间使用捷易拍文件拍摄仪的经验,认为要得到完美的扫描图像,扫描后的图像质量控制十分重 ...
最新文章
- 剑指offer:面试题41. 数据流中的中位数
- LiveRTMP 之RTMP直播高效推送缓冲区
- 工业用微型计算机(9)-指令系统(6)
- Navicat通过SSH连接远程服务器数据库
- 使用 Source Generator 代替 T4 动态生成代码
- Oracle 关于WKT构造SDO_GEOMETRY的问题。
- ASP.NET程序中常用代码汇总(五)
- 重新配对_Apple Watch配对失败的解决办法
- Comparable与Comparator对比
- [转] 数据挖掘 机器学习 模式识别的关系
- 怎样在安卓中实现在锁屏状态下弹出对话框,并可以震动和铃声,就像闹钟似的?...
- 谷歌浏览器安装FeHelper插件
- 想在原有的基础上,再次添加一些阿里图标的进坑
- Flutter图片裁剪
- windows bat批处理基础命令学习教程
- 文本语义相似度检测 API 数据接口
- 微信运动步数:小程序+Java后端,源码可下载
- ss-libev 分析
- 如何PC机上搭建 中标麒麟系统+达梦数据库的开发环境
- 强跟踪ukf matlab,一种改进的强跟踪UKF算法及其在SINS大方位失准角初始对准中的应用...