从 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 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
);

  

  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对话框完全关闭后才会返回,适合任何场合使用:

时间: 2024-12-20 04:29:59

从 TWAIN 设备中扫描图像的相关文章

原型设计测试—如何在不同设备中,进行可用性测试

从广义上讲,可用性测试是以用户体验为中心的交互设计测试,通过用户测试来进行产品评估.这种测试的好处是,在投入前端开发.写代码之前,能够对移动应用程序或者网站进行前期测试.那么有人会问,真的有必要这么去做么?我的回答是:除非这款产品没用,否则你会惊讶发现它对用户来说其实很可怕. 毫无疑问,我们甚至可以在没有原型的前提下就进行可用性测试,它可能是信息组织.制作原型导航的最佳途径了.一些流行的原型前测试种类,大概包括:卡片分类.树结构测试及用户面谈.然而,针对不同的对象的测试,又会有相应的差异.下面,

twain图像处理和扫描控件ImagXpress

ImagXpress是一款功能强大的twain图像处理控件,具有TWAIN扫描.压缩,浏览,注释,打印,图像处理,文档清洁,文件格式转换,使用该TWAIN扫描控件可以添加世界上最强大的图像处理功能到您的应用程序中,控件提供了.NET 和ActiveX版本,可用于32位和64位操作系统. 具体功能: 压缩以及文件格式: 支持1,4,8,16,24,32位图像 支持2到16位灰度图像 支持超过8位,灰度有损的JPEG 支持文本.文件中的Unicode(双字节)字符 支持转换为PDF或扫描为PDF,如

OpenCV-怎样扫描图像、查找表和运行效率的测定

1.目标 在本文中我们要回答下面这4个问题: (1)怎样遍历图像中的每一个像素: (2)OpenCV中矩阵值怎样存储: (3)怎样测试我们的算法的效率: (4)什么是查找表,我们为什么要是用它? 2 关于测试demo 这里,我们考虑一种非常简单的色彩降低方法.我们已经知道,使用了unsigned char类型的矩阵项最高可以拥有256种不同的值.那么对于3通道图像来说,那就有16,000,000种值.处理这么多的像素差,对于我们的算法性能是个很大的考验.但是,有时候,只处理其中的一部分就能得到相

[原创图书]《ActionScript3.0游戏中的图像编程》连载——前言

1946年,计算机在第三次工业革命的推动下得以诞生并发展.从此地球上多了一类人,他们的世界很简单,每天不是和0接触,就是跟1来往.他们低调做人,高调做事,他们务实为民,不求名利,他们,就是可爱可人,可歌可泣的IT工作者--程序员! 都说程序员不善表达,没错,离开0和1,程序员就几乎不会说话了.与此同时,程序员也恰恰是最善于表达的人,他们只用0和1这两个数字,就可以准确无误地将用户的需求传达给电脑并使其正确运行,其语言之简炼,其算法之精准,其逻辑之严谨,其结果之准确,试问除了程序员,还有谁可以做得

【转载】VC++中的图像类型转换--使用开源CxImage类库

一.CxImage类库简介 这只是翻译了CxImage开源项目主页上的部分简介及简单使用. CxImage类库是一个优秀的图像操作类库.它可以快捷地存取.显示.转换各种图像.有的读者可能说,有那么多优秀的图形库,如 OpenIL,FreeImage,PaintLib等等,它们可谓是功能强大,齐全,没必要用其它的类库.但我要说,这些类库基本上没有免费的,使用这些类库,你要被这样那样的许可协议所束缚.在这点上,CxImage类库是完全免费的.另外,在使用上述类库时,你会遇到重重麻烦.因为它们大部分是

怎样在不处理的情况下在ABBYY FineReader中添加图像

可使用快速扫描窗口中的快速打开.扫描并保存为图像或任务自动化任务在没有进行预处理和 OCR 的ABBYY FineReader 中扫描或打开图像.如果你发现文档非常大,而你只需要识别其中的几个页面,就可以派上用场. 若有疑问可直接访问:http://www.abbyychina.com/FRshiyongjiqiao/fr-buchuli-tianjia.html 1. 在色彩模式下拉列表中,选择全彩色或黑白模式. 重要!当文档转换为黑白之后,您不能恢复彩色. 2. 单击所需的自动化任务: o

HTML中关于图像和表格,链接等的知识

下面是我分享的html中关于图像和表格,链接等知识: ①<img/>图像标签 <img/>标签中的一些常见属性:1,src是图像的路径属性,是img标签中必不可少的属性. 2,alt是代表当图像显示失败时代替图像的文本. 3,border是图像的边框 4,width是图像的宽度 5,height是图像的高度 (注意,当使用width或者height时,不要两个同时设置,不然会使图像变形,设置一个属性时就是相对应的等比例缩小或者放大) 6,title是提示信息 ②<table&

如何获得ImageView中的图像

我们知道在Android中ImageView是一个用于显示图像的控件,比如在很多联系人方面的应用中,需要为联系人拍摄头像,并将得到的头像放在一个 ImageView对象中显示.通常,在没有为联系人拍摄头像之前,ImageView对象中显示的是一个缺省的图片.因此,在保存联系人头像数据时,需要比较拍摄前和拍摄后两个图像是否一致,因为拍摄后是可能取消拍摄结果的,因此有可能造成拍摄动作发生前后ImageView中显示的是同一个图像.只有当不一样时,才将ImageView对象中的图像保存到数据库中,否则

移动设备中页面缩放的设定

使用移动设备浏览网页的时候,会发现有的网页可以缩放,有的不可以.这是为什么呢? 这是因为网页的meta中有个属性控制的. <meta content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0" name="viewport"> 这个meta标签表示:强制让文档的宽度与设备的宽度保持1:1,并且文档最大的宽度比例是1.0,且不允许用户点击屏幕放大浏览