Linux下通用掃描器API——SANE( Scanner Access Now Easy)
一、SANE簡介
SANE( Scanner Access Now Easy),是一個應用程式程式設計介面(API),它提供給任何光柵影象掃描器硬體標準化的訪問(平板掃描器,手持式掃描器,視訊和靜止相機,影象採集卡等。 )。該API是公共領域,它的討論和發展,是對所有人開放。目前的原始碼是UNIX(包括GNU / Linux)的和GNU通用公共許可證(下可用SANE API可用於專有應用程式和後端為好,不過)。有關許可證的更多細節上可以找到我們的許可頁面。
SANE是一種通用掃描器介面。這樣的通用介面的價值在於,它允許寫入每個影象採集裝置,而不是為每個裝置和應用的一個驅動器只有一個驅動器。所以,如果你有三個應用程式和四個裝置,傳統上你不得不寫12次不同的程式(3*4種驅動程式); 有了 SANE
不僅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英文
二、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()。如果每個後端將提供這樣的功能,靜態連結將失敗歸因於同一符號的多個定義衝突。這可以通過具有後端來解決被包括具有以下形式的線的報標頭檔案中:
#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官網、Google翻譯、以及本人整理