從 TWAIN 裝置中掃描映像

來源:互聯網
上載者:User
一、簡介TWAIN 資料來源管理程式 (DSM) 工業標準的軟體庫,用於從靜態映像裝置提取映像。絕大部分的掃描器和數位相機都提供了 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
);

 

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. 關閉資料來源

訊息為 MSG_CLOSEDSM。

 

三、CTwainHelper 助手類為了使用方便,我寫了一個靜態 TWAIN 助手類 CTwainHelper。使用 CTwainHelper 的五個函數,就可以簡單地從 TWAIN 裝置擷取映像到檔案中。使用方法如下:

 

  1. 調用 CTwainHelper::Initialize() 確定是否有可用的裝置。
  2. 在視窗訊息迴圈中,調用 CTwainHelper::ProcessMessage() 處理 TWAIN 訊息。
  3. 要擷取映像時,調用 CTwainHelper::GetImage()。
  4. 如果映像已準備好 (如使用者確定掃描映像),視窗會收到 WM_COMMAND 訊息,wParam 為 IDC_TwainHelper。此時應用程式可以調用 CTwainHelper::TransferImage() 擷取映像到檔案中。
具體使用方法請參看範例程式碼。

CTwainHelper 可以在 Visual C++ 6.x/7.x 工程中使用,支援 UNICODE 編譯。因為是靜態類,要改寫成 C 代碼只需要做一點點少量的工作。

 

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

 

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

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

 

TWAIN 助手類: CTwainHelper (包含範例程式碼 35K)
TWAIN 官方網站: http://www.twain.org
TWAIN 標頭檔: http://www.twain.org/devfiles/twain.h
TWAIN Specification: http://www.twain.org/docs/Spec1_9_197.pdf
TWAIN Developers Toolkit: http://www.twain.org/devfiles/twainkit.exe

[2006.2.22] 下面是更簡單的版本,其中的 GetImage 函數內部自動具有訊息迴圈,直到TWAIN對話方塊完全關閉後才會返回,適合任何場合使用:

下載檔案 點擊這裡下載檔案

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.