openKylin论坛

 找回密码

麒麟扫描 kylin-scanner 简介 [复制链接]

Kylin-scanner 是一款用户友好,使用Qt5进行开发的扫描软件。其底层基于SANE标准库。由于SANE标准库支持绝大多数的扫描仪设备,因此该软件也支持绝大多数扫描仪设备。麒麟扫描软件基础功能包括查找和连接扫描设备,获取扫描仪本身默认扫描参数,通过界面的设置参数进行扫描打印,在工具栏的各种编辑操作(旋转、水印、裁切、对称翻转等),以及编辑后的保存操作。麒麟扫描软件高级功能包括了OpenCV开发的一键美化和智能纠偏,基于Tesseract引擎的OCR文字识别。
万事开头难,最基本也是最重要的就在于扫描功能。为此,本文将介绍如何在优麒麟系统上使用SANE 标准库进行扫描设备的默认扫描参数获取和设置扫描参数。

一、SANE标准库介绍
1.SANE开发库名称为:libsane-dev
2.SANE开发库头文件在优麒麟中位置: /usr/include/sane/  
在 /usr/include/sane/目录下有2个头文件,分别是sane.h和saneopts.h 。
sane.h 包括一些通用的扫描接口声明;
saneopts.h 包括扫描参数的声明,在获取和设置扫描参数时使用。
3.SANE API调用基本流程


函数sane_init() 初始化和 sane_exit()退出后端。所有其他调用必须在初始化之后和退出后端之前执行。

函数 sane_get_devices()返回已知的设备列表,即搜索可用扫描仪设备列表。由于某些设备可能已打开或关闭,或者远程主机可能在不同的呼叫之间启动或关闭,因此该列表可能会随着时间的推移而更改。应当注意,此操作可能相对较慢,因为它需要联系所有已配置的设备(其中一些可能在远程主机上)。因此,可以将此过程放到线程中。

用户选择设备后,可通过调用打开设备sane_open() 。可以在任何给定时间打开多个设备。SANE后端不得在任何给定时间对可以打开多少个设备施加人为约束。
之后使用sane_get_option_descriptor()和 通过相应的设备句柄设置打开的设备sane_control_option() 。设置设备时,可以自由地混合使用选项描述符以及设置和读取选项值。前端界面通常会在开始时获取扫描仪所有可用默认选项,然后将可用选项更新到扫描设置页面,以控制可用选项。应当注意,对于给定的句柄,选项的数量是固定的。但是,随着选项的设置,其他选项可能会变为活动或非活动状态。因此,在设置选项之后,可能有必要重新读取一些或所有选项描述符。

设置设备参数进行扫描时,通过调用  sane_get_parameters()可以估算出图像参数的外观。

正确设置设备后,可以通过调用sane_start() 来开始图像获取。后端此时会计算出确切的图像参数。因此,这时的sane_get_parameters() 将返回确切的值,而不是估计值。

具体扫描操作通过调用收集图像数据 sane_read()。在麒麟软件中使用do_scan()实现收集图像数据并保存成pnm图片格式进行替代该函数,这样更自主可控。

二、麒麟扫描参数获取和设置实例
麒麟软件中的扫描参数包括分辨率、色彩模式、尺寸等模式。我们可以通过获取和设置分辨率参数进行初步了解如何获取和设置扫描参数。前端界面如下图所示。



1.获取扫描参数实例伪代码


  1. ``` c++
  2. /* *
  3. * @param sane_handle 扫描句柄
  4.     * @param optnum 分辨率扫描选项
  5.   * @param res 获取的分辨率参数
  6.           */
  7. opt = sane_get_option_descriptor(sane_handle, optnum);

  8. qDebug("Begin print all resolutions:\n");
  9. for (int i=0; opt->constraint.word_list; i++)
  10. {
  11.         int res = *(opt->constraint.word_list+i);
  12. }
  13. ```
复制代码

后端通过调用sane_get_option_descriptor()进行获取支持的分辨率参数,并通过信号和前端页面交互,将分辨率参数在页面上进行展示。

详见kylin-scanner项目的kylinSane.cpp文件中的get_option_resolutions() 函数。

2.设置扫描参数实例伪代码

  1. ``` c++
  2. /* *
  3. * @param sane_handle 扫描句柄
  4. * @param optnum_resolution 分辨率扫描选项
  5. * @param val_resolution 需要设置的扫描设备分辨率
  6. */
  7. Status = sane_control_option (
  8. sane_handle, opt_num_resolution,
  9. SANE_ACTION_SET_VALUE, &val_resolution, nullptr );
  10. ```
复制代码

通过前端页面分辨率组合框中所选分辨率发生改变时,发送信号触发相应槽函数存储分辨率值。当点击扫描按钮后,在后端调用 sane_control_option()进行设置具体的分辨率值,并完成扫描。


详见kylin-scanner 项目的kylinSane.cpp文件中的set_option_resolutions()函数。


三、参考文档和项目地址
Kylin-scanner 项目地址:https://github.com/UbuntuKylin/kylin-scanner
SANE API 标准文档:http://www.sane-project.org/docs.html
SANE API 使用案例:https://github.com/Franklin-Qi/kylin-sane-test



楼主
发表于 2021-1-29 11:06:24
回复

使用道具 举报

openKylin

GMT+8, 2024-5-18 22:05 , Processed in 0.022647 second(s), 21 queries , Gzip On.

Copyright ©2022 openKylin. All Rights Reserved .

ICP No. 15002470-12 Tianjin

快速回复 返回顶部 返回列表