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