官网链接:http://www.sane-project.org/ //简介、源码以及文档应有尽有
参考链接:https://blog.csdn.net/yushulx/article/details/52996199#commentBox //非常感谢该篇博主的答疑解惑
一、SANE简介
SANE( Scanner Access Now Easy),是一个应用程序编程接口(API),它提供给任何光栅图像扫描仪硬件标准化的访问(平板扫描仪,手持式扫描仪,视频和静止相机,图像采集卡等。 )。该API是公共领域,它的讨论和发展,是对所有人开放。目前的源代码是UNIX(包括GNU / Linux)的和GNU通用公共许可证(下可用SANE API可用于专有应用程序和后端为好,不过)。有关许可证的更多细节上可以找到我们的许可页面。
SANE是一种通用扫描仪接口。这样的通用接口的价值在于,它允许写入每个图像采集装置,而不是为每个设备和应用的一个驱动器只有一个驱动器。所以,如果你有三个应用程序和四个设备,传统上你不得不写12次不同的程序(3*4种驱动程序); 有了 SANE,这个数字减少到7(3+4种驱动程序)。当然,储蓄获得的越来越多的驱动程序和/或应用程序被添加更大。
不仅SANE减少开发时间和代码重复,这也引发了在哪些应用程序可以工作的水平。这样,就会使这在以前是闻所未闻的,在UNIX世界的应用。虽然SANE主要是针对UNIX环境中,该标准已被精心设计,使之可以实现在几乎任何硬件或操作系统的API。
虽然SANE是“Scanner Access Now Easy”的首字母缩写的希望当然是SANE在某种意义上确实是明智的,这将是很容易实现的API,同时适应今天的扫描仪硬件和应用程序所需的所有功能。具体而言,SANE应足够宽,以适应装置,例如扫描仪,数码相机和摄像机,以及如图像文件的过滤器的虚拟设备。
如果你熟悉TWAIN,你可能会问,为什么有需要 SANE。简单地说,TWAIN不会将用户界面从设备的驱动程序分开。很不幸,使得它很难,如果不是不可能的,提供图像采集设备的网络透明地访问(如果你有一个LAN全机的是有用的,但是扫描仪连接到只有一两台机器,这显然也为远程相机和这样)。这也意味着,任何特定的TWAIN驱动程序是相当多取一个特定的GUI API(无论是Win32的或Mac的API)。与此相反,SANE干净地从他们的在一个用户界面表示分离控制。结果是,SANE支持命令行驱动接口或网络透明的扫描。
总之,如果TWAIN是一个好一点的设计的话,SANE也就没有存在必要了,存在即合理!事实上TWAIN根本不SANE(sane英文adj. 健全的;理智的;[临床] 神志正常的)。
二、Linux下怎么下载安装(很多发行版会自带,以ubuntu为例)
下载SANE后端
sudo apt-get install sane
or
sane-utilssudo apt-get install
最好做一个libsane.so的软链接(lisane.so.1(本身也是个软链接)可能在lib64或其他lib文件夹下,具体情况根据系统情况而定,)
ln -s /usr/lib/lisane.so.1 /usr/lib/libsane.sosudo
下载SANE官方前端程序(Xsane:很好用)
sudo apt-get install xsane
红帽系下载使用yum
相关命令行
sane-find-scanner //找到SCSI和USB扫描仪和他们的设备文件,具体请看 -h 或 man
scanimage -V //查看当前版本,具体请看 -h 或 man
scanimage -L //查看当前可用设备列表,具体请看 -h 或 man
xsane & //好用的GUI扫描仪前端应用程序,后台启动
xscanimage & //官方简单的GUI前端程序,功能、界面较上者要简单
...... ...... ...... ...... ...... ......
三、代码中使用SANE库须知
3.1 使用须知
SANE是开源的C语言库,其动态库名称为lisane.so.1的软链接,SANE的标准旨在通过提供一个标准的应用编程接口来访问光栅扫描仪硬件,简化软件的开发。这将减少不同的驱动程序执行的数目,从而减少重新实现类似的代码的需要。
SANE是应用编程接口(API),其提供到任何光栅图像扫描仪硬件标准化访问。标准化的接口允许写只是一个为每个扫描仪设备驱动程序,而不是针对每个扫描仪和应用的一个驱动程序。在所需的驱动程序数量的减少提供了开发时间,节省显著。更重要的是,SANE的提出在哪些应用程序可以工作的水平。这样,就会使这在以前是闻所未闻的,在UNIX世界的应用。虽然SANE主要是针对UNIX环境中,该标准已被精心设计,使之可以实现在几乎任何硬件或操作系统的API。
通过一个健全的前端连接到后端的过程是依赖于平台。存在几种可能性:
-
静态链接:一个健全的后端可以被直接链接到前端。而附连到后端的最简单的方法,它在一定程度上在功能限制,因为可用的设备被限制为用于支持前端建时在已链接的那些。但即便如此静态链接是非常有用的,特别是当与可以通过网络访问扫描仪后端结合。此外,也可以通过实施管理已经在他们独特的导出函数名这样的方式被编译几个后端元后端同时支持多个后端。例如,后端称为BE 通常会导出函数调用sane_read()。如果每个后端将提供这样的功能,静态链接将失败归因于同一符号的多个定义冲突。这可以通过具有后端来解决被包括具有以下形式的线的报头文件中:
有了这样的定义,后端是将出口函数名be_sane_read() 。因此,所有的后端将出口唯一的名称。只要一元后端知道这些名字,有可能几个后端链接时相结合,选择并在运行时动态地使用它们。#define sane_read be_sane_read -
动态链接:一个简单但功能更强大的方式来支持多个后端是利用在支持它的平台上动态链接。在这种情况下,一个前端抵靠实现任何SANE后端共享库相连。由于每个动态链接后端出口同一套全球性的符号(所有开始前缀sane_),使程序在运行时加载的动态库不一定是相同的一个作为一个前端得到了对链接。换言之,能够通过安装适当的后端动态库切换后端。
更重要的是,动态链接可以很容易地实现加载其它后端元后端需求。这是一个强大的机制,因为它允许通过安装共享库和更新配置文件只是增加新的后端。 (项目中使用:推荐链接)
- 网络连接:可以说是附加到扫描仪的最终出路是通过网络连接到后端远程计算机上。这使得能够从宇宙中的任何主机扫描图像,只要有一个网络连接到主机和所提供的用户被允许访问该扫描仪。
3.2 图像数据格式
3.3图像传输
所述SANE API发送图像作为帧序列。每个帧覆盖相同的矩形区域作为整个图像,但也可以仅包含在最终图像中的信道的子集。例如,红色/绿色/蓝色图像既可以被发送作为包含样本值对于所有三个通道,或者它可以作为三个帧的序列来发送的单个帧:包含红色通道的第一帧,第二个绿色通道,第三蓝色通道。
从概念上讲,每个帧被发送一次一个字节。每个字节可以包含8个采样值(对于1中的图像的位深度),一个完整的样本值(对于8的图像的位深度),或部分样本值(对于16或更大的图像位深度)。在后一种情况下,每个样值的字节在机器的本地字节顺序被发送。对于深度图1中,最左边的像素被存储在最显著位,并在至少显著位的最右边的像素。
后端实现注意
一种基于网络的元后端将必须确保在图像数据中的字节顺序在必要时适当地调节。例如,当元后端连接到服务器代理,代理可以通知服务器的字节顺序的后端。然后,后端可以根据需要申请调整。在本质上,这实现了'接收机从左到右'的做法。
其中一帧中的样本值被发送的顺序在图中所示。如可以看到的,该值由行发送行和每行从发送最左侧到最右边的列中。左到右,顶到底部发送顺序适用于当图像在其正常方向看(因为这将在屏幕上显示)。
如果一个帧包含多个信道,则信道被以交错的方式发送。图示出了该对其中帧包含完整的红/绿/蓝色的8比特深度对于1比特深度图像,每一个字节包含8个样本值的情况下的单信道。换句话说,一比特深度1帧以字节交错的方式发送。
当发送一帧的图像帧,前端需要知道一个框架代表什么图像的一部分(它应该多少帧期望的那样)。为此,在SANE的API标记,类型为每一帧。这个标准SANE的版本支持以下帧类型:
SANE_FRAME_GRAY:
该帧包含表示从覆盖人的视觉范围内的光谱带的采样值的数据的一个单个信道。图像仅由该帧的。该帧包含数据的三个通道,从红色,绿色和蓝色光谱带代表样本值。样本值交错顺序红色,绿色和蓝色。图像仅由该帧的。
该帧包含数据的一个信道,它表示从红色光谱带样本值。完整的图像由三个框架: SANE_FRAME_RED,SANE_FRAME_GREEN和 SANE_FRAME_BLUE。的顺序的帧传输由后端选择。
该帧包含数据的一个信道,它表示从绿色光谱带样本值。完整的图像由三个框架: SANE_FRAME_RED,SANE_FRAME_GREEN和 SANE_FRAME_BLUE。的顺序的帧传输由后端选择。
该帧包含数据的一个信道,它表示从蓝色光谱带样本值。完整的图像由三个框架: SANE_FRAME_RED,SANE_FRAME_GREEN和 SANE_FRAME_BLUE。的顺序的帧传输由后端选择。
比特深度1和2的组合SANE_FRAME_RGB(或 SANE_FRAME_RED,SANE_FRAME_GREEN,SANE_FRAME_BLUE)很少使用,并且可以不被每个前端支撑。
注:以上内容来自SANE官网、Google翻译、以及本人整理