转自(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
);

  

  1. 打开 DSM (Data Source Manager: 数据源管理器)

TWAIN 是一个数据源管理程序,应用程序首先要使用 MSG_OPENDSM 消息,打开数据源管理器。这里需要指定一个窗口句柄,应用程序应该在此窗口的消息循环中处理 TWAIN 消息 (MSG_PROCESSEVENT)。

  1. 选择 DS (Data Source: 数据源)

因为一个系统中可能存在多个 TWAIN 设备,因此必须选择一个数据源。选择数据源通常有两种方式: 选择默认数据源 (MSG_GETDEFAULT) 和显示选择数据源对话框,由用户来选择数据源 (MSG_USERSELECT)。

  1. 打开 DS

使用 MSG_OPENDS 消息打开数据源。

  1. 设置参数

消息为 MSG_SET,设置各种参数,如获取方式、图像数量等。有些参数由设备驱动支持才有效。

  1. 显示扫描界面

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

  1. 获取图像

如果用户选择扫描什么的,可以在窗口的消息循环中获取到这个事件 (MSG_XFERREADY)。此时,应用程序可以通过 DAT_SETUPFILEXFER 设置文件名,然后用 DAT_IMAGEFILEXFER 获取图像到文件中。

  1. 关闭扫描界面

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

  1. 关闭 DS

消息为 MSG_CLOSEDS。

  1. 关闭数据源

消息为 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 可以在 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 设备中扫描图像相关推荐

  1. [原创]从 TWAIN 设备中扫描图像

    一.简介 TWAIN 数据源管理程序 (DSM) 工业标准的软件库,用于从静态图像设备提取图像.绝大部分的扫描仪和数码相机都提供了 TWAIN 驱动程序,利用统一的 TWAIN 接口,应用程序可以非常 ...

  2. Powerbuilder中Kodak图像扫描控件应用技巧

    Powerbuilder中Kodak图像扫描控件应用技巧 作者:佚名   减小字体 增大字体 摘  要 Powerbuilder中对Kodak图像扫描控件应用的技巧,主要是对扫描出来的图像进行文件头修 ...

  3. 网页扫描图像并以pdf格式上传到服务器端

    本文描述如何通过网页驱动扫描仪.高拍仪等图像扫描设备进行图像扫描,扫描结果经编辑修改后以pdf压缩格式上传到后台java程序中进行服务器端落盘保存. 图像扫描上传如文字描述顺序所介绍,先要驱动扫描设备 ...

  4. OpenCV之core 模块. 核心功能(1)Mat - 基本图像容器 OpenCV如何扫描图像、利用查找表和计时 矩阵的掩码操作 使用OpenCV对两幅图像求和(求混合(blending))

    Mat - 基本图像容器 目的 从真实世界中获取数字图像有很多方法,比如数码相机.扫描仪.CT或者磁共振成像.无论哪种方法,我们(人类)看到的是图像,而让数字设备来"看"的时候,则 ...

  5. android studio点击图片,如何在Android Studio中的模拟器图库中添加图像?

    如何在Android Studio中的模拟器图库中添加图像? 我正在开发图像过滤器应用程序. 但是,如果我没有任何图像,就无法真正尝试. 我知道我可以在电话中对其进行测试,但这并不相同,因为我需要错误 ...

  6. 医学数字成像设备中计算机系统的作用包括,医学影像实用技术教程全部习题答案...

    --------------------------------------------------正文内容开始-------------------------------------------- ...

  7. 无人驾驶环境感知设备中 激光雷达和摄像头各自的优缺点

    无人驾驶环境感知设备中 激光雷达和摄像头各自的优缺点 目前,国外和国内做激光雷达的厂商并不多.比如 Velodyne 推出 16 线.32 线. 64 线和128线激光雷达产品.Quanergy 早期 ...

  8. 解析骁龙移动平台在AR设备中的应用实践

    在过去的一年里,VR/AR 得到了大幅度的商业化应用,无论是经久不衰的科技巨头,或初涉该领域的初创企业,都频频出招.在各式 VR/AR SDK 面世并得到广泛运营的同时,我们看到了诸多平台.开发团队产 ...

  9. 如何获得高质量的扫描图像

    扫描过程从来都是简单的,但是要得到高质量的扫描图像,则涉及到太多的可变因素,因为彩色桌面系统本身就是开放性的.结合长时间使用捷易拍文件拍摄仪的经验,认为要得到完美的扫描图像,扫描后的图像质量控制十分重 ...

最新文章

  1. 剑指offer:面试题41. 数据流中的中位数
  2. LiveRTMP 之RTMP直播高效推送缓冲区
  3. 工业用微型计算机(9)-指令系统(6)
  4. Navicat通过SSH连接远程服务器数据库
  5. 使用 Source Generator 代替 T4 动态生成代码
  6. Oracle 关于WKT构造SDO_GEOMETRY的问题。
  7. ASP.NET程序中常用代码汇总(五)
  8. 重新配对_Apple Watch配对失败的解决办法
  9. Comparable与Comparator对比
  10. [转] 数据挖掘 机器学习 模式识别的关系
  11. 怎样在安卓中实现在锁屏状态下弹出对话框,并可以震动和铃声,就像闹钟似的?...
  12. 谷歌浏览器安装FeHelper插件
  13. 想在原有的基础上,再次添加一些阿里图标的进坑
  14. Flutter图片裁剪
  15. windows bat批处理基础命令学习教程
  16. 文本语义相似度检测 API 数据接口
  17. 微信运动步数:小程序+Java后端,源码可下载
  18. ss-libev 分析
  19. 如何PC机上搭建 中标麒麟系统+达梦数据库的开发环境
  20. 强跟踪ukf matlab,一种改进的强跟踪UKF算法及其在SINS大方位失准角初始对准中的应用...

热门文章

  1. 发布我的下棋作品--Monkey黑白棋(AI还可以,战胜了不少其它的黑白棋程序)
  2. 60级高阶督军套装属性_魔兽世界怀旧服指南:60年代法师套装的选择解析
  3. 【BZOJ5339】【TJOI2018】教科书般的亵渎
  4. /MTd /MD /MDd
  5. java求圆的周长、面积
  6. XP中超级终端使用方法
  7. 如何快速获取已发表学术论文的期刊封面及目录(caj格式下载和caj转pdf)
  8. 大数据上机基础—HDFS文件操作
  9. C++实现1A2B小游戏(源代码)
  10. 牛客银行面试问题总结