從 TWAIN 裝置中掃描影象

91program發表於2008-02-28

一、簡介

TWAIN 資料來源管理程式 (DSM) 工業標準的軟體庫,用於從靜態影象裝置提取影象。絕大部分的掃描器和數碼相機都提供了 TWAIN 驅動程式,利用統一的 TWAIN 介面,應用程式可以非常方便地從這些裝置中獲取影象。
TWAIN結構


二、使用步驟

網際網路上關於 TWAIN 程式設計的中文資料很少,程式碼更是難找到,因此我不得不仔細閱讀了 http://www.twain.org/ 提供的 TWAIN Specification。下面說說使用 TWAIN 介面獲取影象的簡要步驟。

Windows 系統中存在一個 TWAIN_32.dll,所有的 TWAIN 操作都是通過這個 DLL 匯出的 DSM_Entry 函式來實現的 (說實在話,我個人覺得 TWAIN 介面設計得太差了,看看 MS 的WIA,邏輯上非常清晰)。這個函式的宣告如下:

TW_UINT16 FAR PASCAL 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
);
TWAIN定義了大約140個操作訊息。

1. 開啟 DSM (Data Source Manager: 資料來源管理器)

TWAIN 是一個資料來源管理程式,應用程式首先要使用 MSG_OPENDSM 訊息,開啟資料來源管理器。這裡需要指定一個視窗控制程式碼,應用程式應該在此視窗的訊息迴圈中處理 TWAIN 訊息 (MSG_PROCESSEVENT)。

2. 選擇 DS (Data Source: 資料來源)

因為一個系統中可能存在多個 TWAIN 裝置,因此必須選擇一個資料來源。選擇資料來源通常有兩種方式: 選擇預設資料來源 (MSG_GETDEFAULT) 和顯示選擇資料來源對話方塊,由使用者來選擇資料來源 (MSG_USERSELECT)。

3. 開啟 DS

使用 MSG_OPENDS 訊息開啟資料來源。

4. 設定引數

訊息為 MSG_SET,設定各種引數,如獲取方式、影象數量等。有些引數由裝置驅動支援才有效。

5. 顯示掃描介面

使用 MSG_ENABLEDS 訊息,顯示裝置驅動提供的使用者介面 (UI)。

6. 獲取影象

如果使用者選擇掃描什麼的,可以在視窗的訊息迴圈中獲取到這個事件 (MSG_XFERREADY)。此時,應用程式可以通過 DAT_SETUPFILEXFER 設定檔名,然後用 DAT_IMAGEFILEXFER 獲取影象到檔案中。

7. 關閉掃描介面

在視窗的訊息迴圈中獲取到 MSG_CLOSEDSREQ 或 MSG_CLOSEDSOK 訊息,可以關閉掃描介面 (MSG_DISABLEDS)。

8. 關閉 DS

訊息為 MSG_CLOSEDS。

9. 關閉DSM

訊息為 MSG_CLOSEDSM。

三、後話

當然,上面只是一種常用的步驟。其實應用程式完全可以自定義所有的步驟,比如不使用 TWAIN 驅動提供掃描對話方塊而直接掃描,或者掃描影象到記憶體中等等。詳細情況請參考 TWAIN Specification,步驟大同小異,訊息和引數千差萬別,仔細看看應該很容易的。

如果沒有 TWAIN 裝置又要進行 TWAIN 程式開發,可以到 TWAIN 官方網站下載 TWAIN Developers Toolkit,安裝後會有一個虛擬的 TWAIN 裝置。不過應用程式在這個虛擬 TWAIN 裝置中正常工作,不代表一定能在實際的 TWAIN 裝置正常使用,這點需要注意。以前 CTwainHelper 就碰到過這樣的情況 在虛擬 TWAIN 裝置中明明是好的,在我的掃描器上卻不能掃描影象。檢查後發現,原來設定了不支援的引數。

最後,TWAIN 是 Technology Without A Interesting Name 縮寫,直譯為沒有“沒有讓人感興趣名字的技術”,真是一個讓人摸不著頭腦的名字。

 

相關文章