linux下调用扫描仪sane协议

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命令来对扫描仪进行操作,具体用法可以百度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值