通用连接扫描仪文档
不同厂家扫描仪基本都支持twain接口,所以只需要调取twain接口中的方法即可实现控制各个扫描仪。
首先,用c++来调用twain接口实现扫描功能并写好方法供外部调用,然后把该c++程序编译成dll文件,最后用java程序通过jna或者jni的方式调用dll文件中已经暴露的接口方法完成通过java控制扫描仪的流程。
用c++来调用twain接口实现扫描功能并写好方法供外部调用,通过 https://blog.csdn.net/a1101000099/article/details/38561365提供的源码,对其进行改造成dll程序,然后把其中的方法改造的符合自己需求即可。
在c++程序中,scanInterface.cpp里面的方法是用来调用TwainCpp.cpp里面的方法,如果想让java代码调用scanInterface.cpp的方法,需要把此方法写到scanInterface.h头文件中。
图中的callTwAcq和queryTw方法就是暴露给java,供java调用的。
1、queryTw方法是用来查找有几个扫描仪的方法
在java中需要这样调用
Pointer对象中就放着返回值,字符串类型的返回值要这样来接,否则会出现乱码的情况。参考的博客地址:https://blog.csdn.net/troylemon/article/details/46804127/
2、callTwAcq方法主要是设置参数并进行扫描。
其中的size值,代表的是扫描采用的纸张大小,纸张大小和size的对应值如下所示:
另外代码中的10000和20000并不代表任何纸张大小,而是分别代表原稿模式和手动设置纸张大小,并不是twain接口规定的,只是个人的逻辑处理。
无论size是几,最后都调用了Acquire方法(3个方法基本相同,只是不同的模式设置的参数会有不同,所以把方法分开写,以Acquire方法为例)
参数的设置分别对应什么功能有一篇博客已经做出了整理,地址:https://blog.csdn.net/pamxy/article/details/8629213,或者百度关键字“Twain Capabilities”。
设置参数最主要的两个方法,SetCap和SetBOOLCap,一个是设置数字的参数,另一个是设置BOOL型参数。
在java一端,没有什么特别的写法,主要是按照需求传参即可,唯一需要注意的一点就是java的参数类型要和c++一端的参数类型需要对上。下面附上一部分参数对照博客地址:https://blog.csdn.net/abc6368765/article/details/77842066
另外c++程序中有一些特别处理的地方,在此列出。
1. 扫描仪自动生成的图片为bmp图片,jpg图片是有bmp图片转的,这个bmp图片固定为temp.bmp。
2. 由java传过来的path参数,是以’\\’结尾的路径,在此处对最后一个’\\’做了截取,之后的部分全部截掉,因为在有java传到c++中的时候因为未知原因会出现乱码,暂时不知道什么原因,所以在此将后面的部分全部截掉。
3. 在saveDIB之后把bmp图片删除。(把bmp转成jpg的方法就在saveDIB中调用)