大部分扫描仪都支持TWAIN协议,为了方便开发扫描仪应用程序,TWAIN组织在GitHub上放了虚拟扫描仪的示例代码。这份代码只支持加载自带的TWAIN图标,ADF连续扫描也不起作用。为了更真实的模拟扫描不同的图片,我们可以对源码做些修改。
文档扫描流程
修改代码之前,我们可以先了解下扫描文档的流程。虚拟扫描仪就是在source这层。
开发测试环境
开发
- Visual Studio 2017及以上(官方提供了比较早的工程)
- Qt 5.12.11 msvc2017或者Qt 5.12.11 msvc2017_64。这里取决于你要编译32位还是64位的程序
测试
- 在线测试程序:Dynamic Web TWAIN online demo
- 本地测试程序:twacker
编译及调试
编译工程
-
获取源码:
git clone https://github.com/twain/twain-samples.git
-
设置系统变量
QTDIR
: -
在系统
PATH
中添加:C:\Qt\5.12.11\msvc2017_64\bin
。注意,如果你还添加了arm
或者mingw
,一定要保证msvc
在最前面,不然通过windeployqt
部署的时候,拿到的DLL
是错误的。 -
用
管理员权限
启动Visual Studio。导入工程之后编译。编译好会生成TWAINDS_Sample32.ds
或者TWAINDS_Sample64.ds
动态链接库,对应的输出路径分别是C:\Windows\twain_32\sample2\
或者C:\Windows\twain_64\sample2\
。
现在用测试工具打开,应该可以看到扫描仪。点击扫描仪可以加载默认的图片。
调试程序
-
运行twacker。
-
在Visual Studio中挂载进程:
-
挂载之后,执行扫描就会跳到断点。
通过调试程序,我们可以了解源码的工作流程。接下来修改代码。
虚拟扫描仪加载自定义图片
通过调试发现,每次点击扫描,DLL都会被重新加载,所有的变量都会重置。要在内存中保留图片索引不行。解决方法是写一个配置文件。这里有另外一个问题就是windows目录下默认没有写权限,只有读权限。所以创建两个文件source.json
,info.json
,一个放在windows目录下指定自定义图片的目录,一个放在图片目录中包含图片索引信息和一次最大扫描量(用于ADF)。
source.json:
{
"folder": "C:/Users/admin/Pictures/barcode"
}
info.json
{
"index": 0,
"maxcount": 10
}
在CScanner_FreeImage.cpp
的resetScanner()
函数中,我们读取自定义的配置文件。通过索引设置一张当前图片,然后更新索引,写回到配置文件中,用于下一次的扫描:
char szTWAIN_DS_DIR[PATH_MAX];
GetModuleFileName(g_hinstance