TWAIN定義了圖像設備(掃描儀,數碼相機)和應用之間相互通信的協議,各個設備廠商通過支持TWAIN協議使得上層應用可以用同樣的代碼去訪問不同掃描儀
TWAIN主要包括三個要素:
Application - 使用TWAIN的圖像應用,如Photoshop,
Source Manager - 用來管理數據源和應用之間的交互,這個模塊由TWAIN Group來維護,並提供開源代碼(https://github.com/twain/twain-dsm)。windows提供默認實現TWAIN32.dll但是只支持到1.7版本,這個版本最早是存在於windows98 和NT5.0,直到今天也沒升級過。 通常application或source安裝時應該提供更新版本,下載最新代碼編譯后的版本號是2.4,最終二進制文件如下
Winddows:TWAINDSM.dll
Mac:Twain.framework
Linux:/usr/local/lib/libtwaindsm.so
Data Source - 主要用於控制圖像設備,這塊主要由硬件廠商開發,
目前TWAIN協議最新版本號是2.4。對於TWAIN來說,版本2.0是個分水嶺(於2010年制定),這個版本定義了圖像設備允許支持windows,Mac,Linux,並可以允許在x86和x64位系統,目前來說很多硬件廠商都沒有對TWAIN Source升級到2.x,所以一般來說應用程序遵循1.x標准也可以使用大多數掃描儀
通信接口
三個要素之間通信通過DSM_Entry()和DS_Entry()兩個接口,
開發TWAIN應用
應用程序無法之間操作source,所有對source的請求都是通過Source Manager完成DSM_Entry(),根據TWAIN協議推薦,所有的TWAIN命令調用最好在同一個線程完成
當應用使用TWAIN 1.x時,需要提供一個windows句柄接收source的事件
TW_UINT16 TW_CALLINGSTYLE DSM_Entry
( pTW_IDENTITY pOrigin, // source of message
pTW_IDENTITY pDest, // destination of message
TW_UINT32 DG, // data group ID: DG_xxxx
TW_UINT16 DAT, // data argument type: DAT_xxxx
TW_UINT16 MSG, // message ID: MSG_xxxx
TW_MEMREF pData // pointer to data
);
pOrigin - 應用程序信息
pDest - 目標信息,如果是Source Manager,是NULL,如果是Source,則為這個Source的Identity
DG- 操作數據組
DAT -操作數據類型
MSG-消息ID
其中DG/DAT/MSG稱為twain的操作組
twain session
操作掃描儀需要在session內完成,每個TWAIN session包括7個狀態,不同的狀態使用不同操作組對source操作和狀態轉移,應用程序應該遵循狀態對source進行操作。但TWAIN並不強制要求每個source按照state1到state7的步驟進行狀態轉移,比如很多程序在load sourcemanager(state 3)后暫停,然后重復state4-state7(重復選擇掃描儀進行掃描)
- State 1 to 2 -加載source manager 獲取 DSM_Entry接口
- State 2 to 3 - 打開source manager
- State 3 - 選擇 Source
- State 3 to 4 - 打開 Source
- State 4 - 設置source的capacity
- State 4 to 5 - 請求從source獲取數據
- State 5 to 6 - 數據可以准備消息
- State 6 to 7 - 開始數據傳輸
- State 7 to 6 to 5 - 完成傳輸
- State 5 to 1 - 斷開連接
停止掃描兩種方法
-
MSG_STOPFEDDER -發送停止掃描命令,,掃描儀會將掃描過的圖片發過來
-
MSG_RESET -發送停止掃描命令,,掃描儀不會將掃描過的圖片發過來,調完這個命令后,TWAIN狀態將直接到SourceEnabled