Sane是linux下调用扫描仪的通用协议,要使用的话需要先在电脑上/usr/lib/或者/usr/local/lib/下安装libsane.so文件。其调用过程如下:
1.初始化 2.查找设备 3.打开设备 4.设置参数 5.开始扫描 6.保存图像 7.取消扫描 8.关闭设备 9.释放资源。

以下介绍均基于sane.h。
首先对用到的sane定义的枚举数据类型进行介绍:
SANE_Status:
sane的状态结果,用到的有SANE_STATUS_GOOD = 0表示操作成功
SANE_STATUS_EOF=5,一张纸数据读取结束。(sane_read返回结果)
SANE_STATUS_NO_DOCS=7,表示没有文档或者是白页。(sane_start的返回结果)

SANE_Value_Type:
sane的参数数据类型,主要使用SANE_TYPE_BOOL、SANE_TYPE_INT、SANE_TYPE_FIXED、和SANE_TYPE_STRING四种。
需要注意的是,如果数据类型是SANE_TYPE_FIXED,调用sane_control_option设置参数时,要先用SANE_FIX函数做转化,即左移16bit。

#define SANE_FIXED_SCALE_SHIFT   16
#define SANE_FIX(v) ((SANE_Word) ((v) * (1 << SANE_FIXED_SCALE_SHIFT)))

SANE_Unit:
sane参数的单位,这个类型基本没用到。有SANE_UNIT_PIXEL像素、SANE_UNIT_DPI分辨率、SANE_UNIT_MM毫米等。

SANE_Device:
sane设备结构体,name是设备名字(最重要,需要根据name打开设备)。
Vendor、model、type分别是该设备的制造厂商,设备型号和设备类型,没多大用。

SANE_Constraint_Type:
没理解,没用到。

SANE_Range:
该设备支持的sane参数的描述,分别是最小值、最大值和步进量。比如分辨率resolution:该设备支持min最小值75、max最大值1200、quant每次可微调1.

SANE_Option_Descriptor:
sane参数描述,对参数的名字、功能等进行描述。

SANE_Action:
sane对参数进行的操作(很重要)。
SANE_ACTION_GET_VALUE 获取参数值
SANE_ACTION_SET_VALUE 设置参数值
SANE_ACTION_SET_AUTO 设置参数值自动(不常用)

SANE_Frame;
扫描的图像数据类型,常用SANE_FRAME_GRAY灰度图像和SANE_FRAME_RGB彩色图像两种类型。

SANE_Parameters:
扫描仪扫描的图像数据描述,保存扫描图像时用到,很重要。
SANE_Int bytes_per_line; 图像每行数据的字节数,1byte=8bit
SANE_Int pixels_per_line; 图像每行有多少像素,图像的宽度
SANE_Int lines; 图像共有多少行,图像的高度
SANE_Int depth; 图像的深度,即用多少个bit表示一个像素点的值
举例:以图像宽高分别为1024像素和2048像素为例子,黑白图、灰度图和彩色图上述的值分别为

一、初始化

/*
@paramin version_code sane自定义的int型,一般给0
@paramin  authorize 没理解用法 空实现即可
@return  函数执行结果
*/
SANE_Status sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize);

二、查找设备

/*
@paramin device_list 返回查找到的设备列表
@paramin  local_only 是否只查到本地扫描仪,设置为true可提高查找速度
@return  函数执行结果
*/
SANE_Status sane_get_devices (const SANE_Device *** device_list, SANE_Bool local_only);

三、打开设备

/*
@paramin devicename 要打开的设备名字,即SANE_Device->name
@paramin  handle 扫描仪设备指针
@return  函数执行结果
*/
SANE_Status sane_open (SANE_String_Const devicename,SANE_Handle * handle);

四、设置参数

/*
@paramin handle 设备指针
@paramin  option 要操作的参数序号
@paramin  action 执行的动作(设置参数值或者是获取参数值)
@paramin  value  用来设置或者接收参数值的指针
@paramin  info  未理解用法
@return  函数执行结果
*/
SANE_Status sane_control_option (SANE_Handle handle, SANE_Int option,SANE_Action action, void *value,SANE_Int * info);

Sane协议扫描仪的参数设置如下:
每家扫描仪厂商有自己的参数名字、参数取值。为了便于设置,在传给sane的时候,要设置哪个参数则传递这个参数的序号。
以设置分辨率(DPI)300为例:
Int value = 300;
影源的参数名字叫resolutionA 该厂商的参数序号为5,则调用时为

sane_control_option (SANE_Handle handle, 5 ,SANE_ACTION_SET_VALUE, &value,SANE_Int * info);

奔图的参数名字叫resolutionB 该厂商的参数序号为9,则调用时为

sane_control_option (SANE_Handle handle, 9 ,SANE_ACTION_SET_VALUE, &value,SANE_Int * info);

参数名和序号的对应关系需要自己维护。
另:序号为0的参数的值表示该扫描仪支持多少个参数,假设为n,则可以遍历n获取参数名对应的参数序号。
五、开始扫描

/*
@paramin handle  设备指针
@return  函数执行结果(扫描成功返回0,进纸器无纸返回7,7为扫描正常结束标志)
*/
SANE_Status sane_start (SANE_Handle handle);

只需要调用一次扫描仪会将所有纸进行扫描,若要保存全部扫描数据,则需要重复调用,直到返回值不为0(正常结束返回值为7)

六、保存图像(读取图像数据)
需要自己实现将扫描数据保存为图像,调用的是sane的

/*
@paramin handle  设备指针
@paramin  data  接收读取到的扫描图像数据buffer
@paramin  max_length  data的长度
@paramin  length   实际读到的数据长度
@return  函数执行结果(读取成功返回0,一张纸读完返回5,5为正常数据读取结束标志)
*/
SANE_Status sane_read (SANE_Handle handle, SANE_Byte * data,SANE_Int max_length, SANE_Int * length);

将读取到的图像数据和自定义的图像头数据一起组成新的buffer,生成图像。

七、结束扫描

void sane_cancel (SANE_Handle handle);

八、关闭设备

void sane_close (SANE_Handle handle);

九、释放资源

void sane_exit (void);

附基于sane的扫描demo QT_SANE。
左边lineedit填写参数序号,如2(mode扫描模式)、3(resolution分辨率)等。
右边lineedit填写参数值,如Color、300等。



代码下载地址:https://github.com/ForrestSunhh/Sane
https://download.csdn.net/download/weixin_44462930/85223430
此外,也可以用scanimage命令来对扫描仪进行操作,具体用法可以百度。

linux下调用扫描仪sane协议相关推荐

  1. Linux下几种RTP协议实现的比较和JRTPLIB编程讲解

    流媒体指的是在网络中使用流技术传输的连续时基媒体,其特点是在播放前不需要下载整个文件,而是采用边下载边播放的方式,它是视频会议. IP电话等应用场合的技术基础.RTP是进行实时流媒体传输的标准协议和关 ...

  2. java调用c 生成so,Java在linux下调用C/C++生成的so文件

    Java在linux下调用C/C++生成的so文件 1. CplusUtil.java是java web工程中的一个工具类 内容如下: CplusUtil.java package cn.undone ...

  3. Linux 下调用UEFI的函数

    Linux 下调用UEFI的函数 摘要 Linux 调用UEFI function 时候调用约定的转换 64bits calling convention Microsoft calling conv ...

  4. Linux下调用fork或system启动子进程的信号和资源释放相关问题

    最近一段时间,公司的网管系统二期优化需要新增功能,实现对网管客户端程序进行保护的监控脚本的自动更新及保护进程的监控告警.网管客户端程序分为两部分:客户端GatherClient及保护进程gatherc ...

  5. python能调用身份证读卡器吗_用Python在Linux下调用新中新DKQ-A16D读卡器,读二代证数据...

    1.背景 最近在研究二代证读卡器,手头上的设备是新中新DKQ-A16D,在官网(https://www.onecardok.com.cn/download)逛了一圈,发现Win下的示例,浏览器插件很多 ...

  6. 在Windows/Linux下调用API函数实现重启系统

    一.Linux下重启系统 linux下很简单,直接看代码: #include <unistd.h> #include <sys/reboot.h>bool rebootSyst ...

  7. Linux下C语言UDP协议通信实践

    UDP和TCP协议一样,都是传输层协议.是无连接的,不安全的,报式传输层协议,通信过程默认也是阻塞的.其通信特点主要如下: (1)不需要建立连接 ,所以不需要进行 connect () 操作 (2)每 ...

  8. linux下调用python脚本,Linux下QT调用Python脚本的解决方案,Qt,python,一种,解决办法

    最近在做一个深度学习对图片中对象识别效果的检测工具,其主要功能就是将自己标注的图片与识别结果图片进行对比然后计算识别的准确等参数,并提供原图与结果图片的显示功能. 脚本主要完成识别与计算功能,QT完成 ...

  9. 如何在Ubuntu系统下使用扫描仪(by quqi99)

    作者:张华  发表于:2016-03-03 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 ( http://blog.csdn.net/quqi99 ) Li ...

  10. Linux 下 的 cc 和 gcc

    可以用yum在线安装gcc: [root@VM_0_12_centos ~]# yum install gcc Loaded plugins: fastestmirror, langpacks Loa ...

最新文章

  1. Delphi:对TNotifyEvent的理解
  2. CloudStack设计思想
  3. 浅谈Linux下的EXT3文件系统
  4. 【网络安全】Penelope:一款功能强大的Shell处理工具
  5. 开发中经常使用的5种设计模式
  6. Git指令2 - 操作分支
  7. 使用TensorFlow给花朵#127802;分类
  8. 解决vue插值表达式闪烁问题
  9. 国内maven镜像,快的飞起
  10. python-普通pdf的添加水印
  11. 迅影QQ视频查看v2.0 源码
  12. 刑事案件的25大疑难问题
  13. DAY11:尚学堂高琪JAVA(116~118)
  14. Kali新安装时软件安装及配置[自用 欢迎补充]
  15. Eclipse新建Android项目报错解决方案详细汇总
  16. 各台平台电商API接口吊桶,API接口分类
  17. Wallis formula(华里士/沃利斯公式)
  18. c语言实例 魔术师的猜牌术(1),C语言实例:魔术师的猜牌术(2)
  19. 微博数据解析 | 可口可乐 VS 元气森林
  20. 逻辑树与视觉树基本概念

热门文章

  1. [机缘参悟-16]:FPGA编程、软件编程与公司管理有着相似原理
  2. iOS性能优化系列篇之“优化总体原则”
  3. matlab用平方法怎么求传递闭包矩阵,逐次平方法计算传递闭包
  4. CVBS、VGA、HDMI、MIPI等8种视频接口详解
  5. python图像文字识别算法_Python图像处理之图片文字识别功能(OCR)
  6. 用 Python 实现电影订票系统 | 内附源码
  7. java观察者模式举例
  8. 将货币转换为大写形式用c语言,C#:小写金额转换为大写
  9. Windows常用快捷键和Windows CMD命令大全
  10. opencv下载百度网盘链接及安装