linux下调用扫描仪sane协议

news/2024/11/28 19:33:59/

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


http://www.ppmy.cn/news/340045.html

相关文章

介绍一些免费/开源的医学影像后处理工具

来源&#xff1a;融视影像科技 综述 医学影像的处理有两个特质。一是复杂&#xff0c;整个处理流程涉及多种算法&#xff0c;需要调整的参数较多。二是发展快&#xff0c;从采集、重建到后处理&#xff0c;新处理方法层出不穷&#xff0c;每年都有新工具&#xff0c;每五年又…

中国金融,如何向科技要答案?

一个科技初创公司&#xff0c;能否凭借科创成果及时获得信贷准入&#xff1f; 一个农民兄弟能否在春播时&#xff0c;获得精准的无抵押贷款&#xff1b;秋收时&#xff0c;通过银行App找到性价比最高的买家&#xff1f; 一家企业&#xff0c;能否通过其生产及交易信息获取线上融…

运动款蓝牙耳机哪个品牌好、运动蓝牙耳机推荐高性价比

很多人觉得听音乐跑步会影响跑步的体验感&#xff0c;其实音乐对跑步的过程是有积极作用的&#xff0c;除了可能选择的音乐节奏不正确之外&#xff0c;你可能还需要更换一款靠谱的运动耳机。不要一直追求更好的衣服、鞋子、手表等装备了&#xff0c;还在用有线耳机听歌跑步的朋…

BitSet—位图

BitSet &#x1f50e;概念&#x1f50e;位图的模拟实现set()get()reSet()getUsedSize()完整代码 &#x1f50e;利用位图进行排序&#x1f50e;结尾 &#x1f50e;概念 位图 用某一位表示存储的状态 位图的适用场景 海量数据数据为自然数(≥ 0)数据不重复 举个栗子&#x1f3…

达人评测:华为手环b6和b5有什么区别?哪个好?优缺点曝光真相

华为手环b6与b5的区别介绍 一、基本参数对比 华为手环b6和b5这两款手机具体参数规格和用户评价参考看下官方旗舰店的‘商品评价’&#xff0c;链接帮贴上了 华为手环b6更多使用感受和评价&#xff1a;https://www.jd.shouji.com/b6 华为手环b5更多使用感受和评价&#xff1a;…

java 获取类里面的属性和函数方法,并运行类的函数方法

助手类&#xff0c;获取类里面的属性和函数 import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.List;//TODO 获取类里面的属性和函数方法 public class ClassUtils {//TODO 获取类里面…

flutter自定义系列之简单的K线图绘制

上篇文章讲了flutter自定义的相关流程&#xff0c; 今天继续练习下flutter的自定义K线&#xff1a; 我们可以通过自定义Painter来实现一个简单的K线图界面&#xff1a; 创建一个自定义的Painter&#xff0c;用于绘制K线图&#xff1a; import dart:ui;import package:flutte…

华为OD机试真题 JavaScript 实现【勾股数元组】【2022Q4 100分】,附详细解题思路

一、题目描述 如果三个正整数A、B、C ,ABC则为勾股数 如果ABC之间两两互质&#xff0c;即A与B&#xff0c;A与C&#xff0c;B与C均互质没有公约数&#xff0c; 则称 其为勾股数元组。 请求出给定n~m范围内所有的勾股数元组。 二、输入描述 起始范围 1 < n < 10000 n &…