從TWAIN設備中掃描圖像分析(20210402181833)_第1頁
從TWAIN設備中掃描圖像分析(20210402181833)_第2頁
從TWAIN設備中掃描圖像分析(20210402181833)_第3頁
從TWAIN設備中掃描圖像分析(20210402181833)_第4頁
從TWAIN設備中掃描圖像分析(20210402181833)_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、、簡介 TWAIN數(shù)據(jù)源管理程序(DSM)工業(yè)標準的軟件庫,用于從靜態(tài)圖像設備提取圖像。絕大 部分的掃描儀和數(shù)碼相機都提供了TWAIN驅(qū)動程序,利用統(tǒng)一的TWAIN 接口,應用程 序可以非常方便地從這些設備中獲取圖像。 二、使用步驟 互聯(lián)網(wǎng)上關于 TWAIN編程的中文資料很少,代碼更是難找到,因為我不得不仔細閱讀 了 /_ 提供的 TWAIN Specification 。下面說說使用 TWAIN 接口獲取圖 像的簡要步驟。 Windows系統(tǒng)中存在一個 TWAIN_32.dll,所有的TWAIN操作都是通過這個 DLL導出 的DSM_Entry函數(shù)來實現(xiàn)

2、的(說實在話,我個人覺得TWAIN接口設計得太差了,看看 MS的WIA,邏輯上非常清晰)。這個函數(shù)的聲明如下: TW_UINT16 FAR PASCAL DSM_E ntry( pTW_IDENTITY pOrigi n, / Source of message pTW_IDENTITY pDest, / Dest in ation of message TW_UINT32 DG, / Data group ID: DG_xxxx TW_UINT16 DAT, / Data argume nt type: DAT_xxxx TW_UINT16 MSG, / Message ID: MSG_xx

3、xx TW_MEMREF pData / Poi nter to data ); 1. 打開 DSM (Data Source Manager:數(shù)據(jù)源管理器) TWAIN是一個數(shù)據(jù)源管理程序,應用程序首先要使用MSG_OPENDSM 消息,打開數(shù)據(jù) 源管理器。這里需要指定一個窗口句柄,應用程序應該在此窗口的消息循環(huán)中處理TWAIN 消息(MSG_PROCESSEVENT)。 2. 選擇 DS (Data Source: 數(shù)據(jù)源 ) 因為一個系統(tǒng)中可能存在多個 TWAIN 設備,因此必須選擇一個數(shù)據(jù)源。選擇數(shù)據(jù)源通常 有兩種方式 : 選擇默認數(shù)據(jù)源 (MSG_GETDEFAULT) 和顯示選擇數(shù)

4、據(jù)源對話框, 由用戶來 選擇數(shù)據(jù)源 (MSG_USERSELECT) 。 3. 打開 DS 使用 MSG_OPENDS 消息打開數(shù)據(jù)源。 4. 設置參數(shù) 消息為 MSG_SET ,設置各種參數(shù),如獲取方式、圖像數(shù)量等。有些參數(shù)由設備驅(qū)動支持 才有效。 5. 顯示掃描界面 使用 MSG_ENABLEDS 消息,顯示設備驅(qū)動提供的用戶界面(UI) 。 6. 獲取圖像 如果用戶選擇掃描什么的,可以在窗口的消息循環(huán)中獲取到這個事件 (MSG_XFERREADY) 。此時,應用程序可以通過 DAT_SETUPFILEXFER 設置文件名, 然后用 DAT_IMAGEFILEXFER 獲取圖像到文件中。

5、7. 關閉掃描界面 在窗口的消息循環(huán)中獲取到 MSG_CLOSEDSREQ 或 MSG_CLOSEDSOK 消息,可以關 閉掃描界面 (MSG_DISABLEDS) 。 8. 關閉 DS 消息為 MSG_CLOSEDS 9. 關閉數(shù)據(jù)源 消息為 MSG_CLOSEDSM 。 三、CTwainHelper 助手類 為了使用方便,我寫了一個靜態(tài) TWAIN 助手類 CTwainHelper 。使用 CTwainHelper 的 五個函數(shù),就可以簡單地從 TWAIN 設備獲取圖像到文件中。使用方法如下 : 1. 調(diào)用 CTwainHelper:Initialize() 確定是否有可用的設備。 2.

6、在窗口消息循環(huán)中,調(diào)用 CTwainHelper:ProcessMessage() 處理 TWAIN 消息。 3. 要獲取圖像時,調(diào)用 CTwainHelper:GetImage() 。 4. 如果圖像已準備好(如用戶確定掃描圖像),窗口會收到 WM_COMMAND 消息, wParam為IDC_TwainHelper。此時應用程序可以調(diào)用 CTwai nH elper:Tra nsferlmage()獲取圖像到文件中。 具體使用方法請參看示例代碼。 CTwa in Helper 可以在 Visual C+ 6.x/7.x工程中使用,支持UNICODE 編譯。因為是靜 態(tài)類,要改寫成 C代碼只

7、需要做一點點少量的工作。 四、后話 當然,上面只是一種常用的步驟。其實應用程序完全可以自定義所有的步驟,比如不使用 TWAIN驅(qū)動提供掃描對話框而直接掃描,或者掃描圖像到內(nèi)存中等等。詳細情況請參考 TWAIN Specification ,步驟大同小異,消息和參數(shù)千差萬別,仔細看看應該很容易的。 如果沒有TWAIN設備又要進行 TWAIN程序開發(fā),可以到 TWAIN官方網(wǎng)站下載 TWAIN Developers Toolkit ,安裝后會有一個虛擬的TWAIN設備。不過應用程序在這個虛 擬TWAIN設備中正常工作,不代表一定能在實際的TWAIN設備正常使用,這點需要注 意。以前 CTwainH

8、elper 就碰到過這樣的情況在虛擬TWAIN 設備中明明是好的,在我 的掃描儀上卻不能掃描圖像。檢查后發(fā)現(xiàn),原來設置了不支持的參數(shù)。 最后,TWAIN 是 Technology Without A Interesting Name縮寫,直譯為沒有 沒有讓人感 興趣名字的技術”,真是一個讓人摸不著頭腦的名字。 TWAIN助手類:CTwa in Helper (包含示例代碼 35K) TWAIN 官方網(wǎng)站:_ TWAIN 頭文件:/devfiles/twain.h TWAIN Specificatio n:http:/w

9、ww.twain .org/docs/Spec1_9_197.pdf TWAIN Developers Toolkit:/devfiles/twainkit.exe 2006.2.22下面是更簡單的版本,其中的GetImage函數(shù)內(nèi)部自動具有消息循環(huán),直到 TWAIN對話框完全關閉后才會返回,適合任何場合使用: 下載文件 點擊這里下載文件 轉(zhuǎn)Twain 學習 2009-05-03 11:34:07| 分類:C語言學習|字號訂閱 一、TWAIN的文件組成 TWAIN共包括4個二進制文件。如果要使用該接口,就必須要保證他們被成 功地安裝在本地計算機上。 文件名

10、說明 TWAIN_32.DLL 32位應用程序的支持文件,32位程序使用 TWAIN通訊必須使用該文件。 TWAIN.DLL16位應用程序的支持文件,16位程序使用 TWAIN通訊必須使用該文件。 TWUNKER_32.EX實現(xiàn)32位應用程序與32位數(shù)據(jù)源進行通訊, 它運行時不可見。 TWUNKER_16.EX實現(xiàn)32位應用程序與16位數(shù)據(jù)源進行通訊, 它運行時不可見。 注意:在 WindowsNT環(huán)境下16位數(shù)據(jù)源不能 夠正常工作。 在 Windows 操作系統(tǒng)中(Windows 9x / 2000 / XP ),Microsoft 已經(jīng) 把這些文件作為系統(tǒng)文件隨同操作系統(tǒng)一起發(fā)布了。你可以

11、在Windows安裝目 錄中查找到這些文件。如果我們要編程來實現(xiàn)對TWAIvN的訪問,還需要最重要 的頭文件。你通過訪問該 /devfiles/twain.h地 址來獲得TWAIN提供的頭文件。 二、TWAIN的結構 TWAIN依靠三個組件協(xié)同完成與圖像設備的通訊和數(shù)據(jù)傳輸工作,這三個組 件就是 Application 、Source Manager 和 Source 。 組件 說明 Applicati on 就是你要編寫的應用程序。 Source Man ager 是由TWAIN提供的一個Source的管理器,它不僅可以收集本 地系統(tǒng)已經(jīng)安裝了的圖像設備

12、,還可以根據(jù)需要去加載設備。 同時,它最重要的功能是擔任Application 與Source通訊的 橋梁。(其實,它就是我們前面提到的組成文件中的 dll文件。) Source 在這里可以看作是圖像設備。事實上它是由設備廠家提供的一 個dll文件。這個dll文件是支持twain接口的。(該文不討 論關于twain在Source中的應用。) 它們的層次結構圖如下: 從該圖我們可以看到,Application要從Source獲得圖像數(shù)據(jù),必須通過 Source Manager傳遞來實現(xiàn)。Application 與Source Manager間的通訊是靠調(diào) 用TWAIN提供的DSM_Entry()

13、函數(shù)實現(xiàn)。而Application 不能直接與 Source通 訊,Source Manager與Source間的通訊是靠調(diào)用 TWAIN提供的DS_Entry()函 數(shù)實現(xiàn)(在這里,我們不用關心 Source Manager如何去調(diào)用DS_Entry函數(shù)。 三、TWAIN的用戶界面 當我們使用TWAIN接口去獲得圖像數(shù)據(jù)的時候,會涉及到一些的用戶界面, 首先是我們的應用程序界面,然后是 Source Manager 提供的用戶界面以及圖像 設備(Source)所提供的用戶界面。 在我們的應用程序中,可以通過“選擇設備”來打開 Source Manager 的標 準用戶界面。 Source M

14、anager 的界面由 Source Manager 提供。在這個界面中可 以讓用戶選擇他想要使用的圖像設備。選中想要的設備后,再通過“獲取”來 打開圖像設備(Source)提供的用戶界 面進行現(xiàn)應的操作。(注:Source提供 的界面會因為你使用的圖像設備不同而有差異。) 對于這些界面,TWAIN提供了非常靈活的處理方法。對于 Source Manager提供 的用戶界面以及圖像設備 (Source) 所提供的用戶界面, 我們可以選擇是否顯示它 們,甚至我們還可以按自己的要求去改寫這些用戶界面。 四、TWAIN的接口函數(shù) 要編寫應用程序?qū)崿F(xiàn)與支持 TWAIN標準的圖像設備通訊,只需要了解上面

15、提 到的DSM_Entry()接口函數(shù)。TWAIN定義了大約140個操作消息。你只要把這些 消息通過DSM_Entry()函數(shù)發(fā)給Source Manager,就可以實現(xiàn)對選定的 Source 進行相應的操作。 Source Manager 會分辨那些消息屬于自己,那些消息是該轉(zhuǎn) 發(fā)給 Source。 在介紹DSM_Entry()前,我們先來了解一下的TWAIN定義的消息格式。TWAIN 把它定義的操作稱為 Triplets 操作,就是每個操作用三個定義的參數(shù)來表示。 這個三個參 數(shù)用不同前綴名來區(qū)分。 每個 Triplets 操作都是唯一的, 不會有歧 意,它們代表一個特定的操作行為。這三個

16、參數(shù)類型分別是Data Group(前綴名 DG_ )、Data Argument(前綴名 DAT_ )和 Message ID(前綴名 MSG_ )每個參 數(shù)都包含有各自的信息。比如: DG_CONTROL / DAT_PARENT / MSG_OPENDSM 表示一個打開Source Manager的操作,這些參數(shù)在 TWAIN.H中都有定義。其他 的操作(設置掃描儀的分辨率、 獲得設備支持的功能等等 )你可以去查看 TWAIN 的參考手冊,我將在后面編程應用中介紹幾個最常用的操作。 現(xiàn)在,我們明白了 TWAIN定義的Triplets 操作,但是這還不夠。在使用 DSM_Entry()前,

17、必須要加載TWAIN_32.DLL文件以獲得DSM_Entry()函數(shù)指針。 (注意:在你程序中應該添加前面提到的 TWAIN.H頭文件哦!) DSMENTRYPROC lpDSM_Entry; /* DSM_Entry 入口函數(shù)的指針 HMODULEhDSMDLL;/* Twain_32.Dll 句柄 /* 加載 TWAIN_32.DLL文件 if (hDSMDLL = LoadLibrary(TWAIN_32.DLL) != NULL) if (hDSMDLL)/* 檢查 TWAIN_32.DLL是否 加載 if ( (lpDSM_Entry =(DSMENTRYPROC) GetProc

18、Address(hDSMDLL,MAKEINTRESOURCE(1)!=NULL) /* 成功獲得 DSM_Entry()函數(shù)指針; 現(xiàn)在我們明白了,TWAIN所有的操作都是通過DSM_Entry()函數(shù)來實現(xiàn)的, 所以了解該入口函數(shù)很有必要。它定義如下: TW_UINT16 FAR PASCAL DSM_Entry ( pTW_IDENTITY pOrigin, pTW_IDENTITY pDest, TW_UINT32 DG, 數(shù) : DG_xxxx TW_UINT16 DAT, 數(shù): DAT_xxxx TW_UINT16 MSG, 數(shù): MSG_xxxx TW_MEMREF pData

19、/* 指向操作發(fā)起者的指針 /* 指向目標對象的指針 /* Triplets 操作的 DG參 /* Triplets操作的 DAT參 /* Triplets操作的 MSG參 /* 指向返回數(shù)據(jù)塊的指針 ); 其中DG DAT MSG參數(shù)表示一個你想執(zhí)行的Triplets 操作。pOrigin 表示發(fā)起 Triplets 操作的對象。 pDest 表示接收 Triplets 操作的對象。 pData 用于獲得執(zhí)行 Triplets 操作后返回的數(shù)據(jù)。 對于每個Triplets 操作,都是由DG DAT MSGE個參數(shù)組合構成的。 pOrigin pDest 參數(shù)會根據(jù)不同的 Triplets 操

20、作,而使用不同的值。 函數(shù)執(zhí)行后會返回一個值來表示操作是否成功。如果返回值為TWRC_SUCCESS 示操作成功,TWRC_FAILURE示操作失敗。同樣根據(jù)Triplets 操作的類型不同, 還會有其他的返回值。比如 TWRC_CANCETWCC_LOWMEM O R具體信息你可以 參考TWAIN的說明手冊 五、TWAIN的操作流程 Application 、 Source Manager 和 Source 要實現(xiàn)數(shù)據(jù)傳輸,必須遵循一個 操作流程。 你要進行的操作應該在這個流程規(guī)定的動作隊列中按邏輯去執(zhí)行。 比 如,在沒有加載 Source Manager前,Application 是不能要

21、求Source傳輸數(shù)據(jù) 的。為了更好的去描述這個流程,TWAIN為該流程定義了 7個狀態(tài)(1-7) 0 狀態(tài)位 1, 2, 3 這幾個狀態(tài)是用于描述 Source Manager 的,它們是 Source Manager 專有的 狀態(tài)位,所以 Source Manager 的標志位是不會大于 3的. 狀態(tài)位 4, 5, 6, 7 這幾個狀態(tài)是 Source 專有的。如果 Source 打開了, Source 的標志位就不 會小于 4;如果 Source 關閉了, Source 就沒有了標志位。 要注意,我們的應用程序可以使用了多個Source,每個與Source的連接都是一 個單獨的會話,對于

22、打開的每個Source,他們的標志位都是相互獨立的,不互相 關聯(lián)?,F(xiàn)在就來看看流程圖。 流程標志位說明 狀態(tài)1 -準備會話 在 Application 和 Source Manager 建立會話前, Source Manager 的標志位 是 1. 在這個時候,Source Man ager還沒有被加載到內(nèi)存中。如果 Source Man ager被 加載到內(nèi)存中 , 則狀態(tài)位是 2 或者 3。 狀態(tài) 2 -加載 Source Manager Source Manager 現(xiàn)在已經(jīng)被成功地加載到了程序中,但是沒有打開 Source Manager。 在這個時候 , Source Manager

23、 開始準備去接受 Application 的 Triplets 操作。 狀態(tài) 3 -打開 Source Manager Source Manager已經(jīng)打開并且準備去管理 Source.Source Manager現(xiàn)在準備 向Source發(fā)送打開操作,去打開指定的 Source,并等待所有針對Source的操 作結束后,去關閉打開的 Source. Source Manager 在會話關閉前,狀態(tài)位將保 持為 3. 當 Application 打開的 Source 沒有關閉時, Source Manager 會拒絕關 閉。 狀態(tài) 4 -打開Source 在響應Application 的一個指定

24、的Triplets 操作后,Source被加載到系統(tǒng) 中,并且被 Source manager 打開。 Source 在加載前將檢測是否有足夠的系統(tǒng)資 源讓自己運行(內(nèi)存、設備是否可用等等)o Application不僅可以查詢Source 的性能參數(shù) (當前解析度、是否支持彩色或黑白圖像、自動文檔傳送是否可用 ), Application 還可以去設置的 Source 的性能參數(shù)。比如, Application 可以要求 Source 按指定的分辨率傳輸黑白圖像。 注意: 可以在 Source 的狀態(tài)位是 4, 5, 6, 或 7 時,去查詢 Source 的性能參數(shù)。 但是要想設置 Sou

25、rce 的性能參數(shù)必須在狀態(tài)位是 4的時候設置,除非 Application 和 Source 有特殊 的約定, 否則在標志位為其他數(shù)的時候都不可以 進行性能參數(shù)設置。 狀態(tài) 5 - Source可用 現(xiàn)在可以讓 Source 工作了,此時 Source 開始為數(shù)據(jù)傳輸做準備。 在該狀態(tài) 下,可以執(zhí)行一個 Triplets 操作,用以選擇是否讓 Source 顯示它自己的用戶界 面 ( Source 提供的軟件界面)。當 Source 準備好給 Application 傳輸數(shù)據(jù)時, 標志位就從 5 變?yōu)?6 了。 狀態(tài)6 -準備數(shù)據(jù)傳輸 該狀態(tài)下, Source 已經(jīng)準備好了為 Applica

26、tion 傳輸數(shù)據(jù)。在傳輸工作開 始前, Application 應該查詢將要被傳輸?shù)膱D像的相關信息 ( 分辨率,圖像大 小),如果Source還要傳輸音頻數(shù)據(jù),那么在傳輸圖像數(shù)據(jù)前,Application 必須要把所有的音頻數(shù)據(jù)先傳完。 注:某些數(shù)碼相機帶有攝像功能, 可以記錄一 些聲音信息。 狀態(tài)7 -傳輸開始 Source 開始進行數(shù)據(jù)傳輸,它把獲得的數(shù)據(jù)傳輸給你的應用程序。 傳輸工 作要么成功完成,要么提前中止。在傳輸工作完成后, Source 將會發(fā)送一個返 回代碼去表示傳輸工作的最終結果。 七、TWAIN最常用的Triplets 操作 這里將對TWAIN中最常用的Triplets

27、操作做一個簡單的介紹,為了便于理解和 記憶,我將結合前面講的操作流程順序去介紹這些常用的 Triplets 操作。 1 .加載Source Manager并獲得DSM_Entry入口函數(shù)(狀態(tài)1到2) 應用程序在調(diào)用DSM_Entry函數(shù)指針前必須加載Source Manager。這里沒有使 用Triplets 操作。你可以使用 LoadLibrary() 函數(shù),加載TWAIN_32.DLL文件。 并使用GetProcAddress()函數(shù),獲得 DSM_Entry函數(shù)指針 2. 打開 Source Manager ( 狀態(tài) 2 到 3) Triplets 操作:DG_CONTROL / DA

28、T_PARENT / MSG_OPENDSM 通過該操作,你可以打開Source Man ager,并且還要在你的應用程序中,指定 一個窗體作為 Source 的父窗口。 Source Manager 將通過該窗體,把 Source 的 消息傳遞給你的應用程序。 3. 選擇 Source ( 狀態(tài) 3 期間 ) Triplets 操作: DG_CONTROL / DAT_IDENTITY / MSG_USERSELECT 你的應用程序發(fā)送該操作后,將顯示 Source Manager 的用戶界面,它是一個對 話框。這個對話框中顯示了系統(tǒng)中所有支持 Twain 的設備列表。 系統(tǒng)默認設備將 高亮

29、顯示在列表框中。你可以通過該列表框選擇你想要的輸入設備。 4. 打開 Source ( 狀態(tài) 3 到 4) Triplets 操作: DG_CONTROL / DAT_IDENTITY / MSG_OPENDS 該操作可以打開你選擇的 Source( 圖像輸入設備 ) ,同時, Source Manager 會給 該 Source 分配一個唯一的標識符。 你要把打開的這個 Source 放在一個指定的結 構中,以便于在后面和該 Source 進行通訊。 5設置 Source 的性能參數(shù) ( 狀態(tài) 4 期間 ) Triplets 操作: DG_CONTROL / DAT_CAPABILITY /

30、 MSG_GET DG_CONTROL / DAT_CAPABILITY / MSG_SET 這里有兩個 Triplets 操作,通過使用這兩個操作可以去查詢當前設備是否支持 的某種功能,如果支持,還可以獲得設備功能的當前值、默認值、以及可以重新 設置的范圍。你還可以根據(jù)查詢的結果, 按你的要求去重新設置該功能的當前值。 6請求從 Source 獲取數(shù)據(jù) ( 狀態(tài) 4 到 5) Triplets 操作: DG_CONTROL / DAT_USERINTERFACE / MSG_ENABLEDS 通過該操作, 可以讓 Source 顯示它的用戶界面, Source 會去為數(shù)據(jù)傳輸作準備。 7認數(shù)

31、據(jù)準備傳輸 ( 狀態(tài) 5到 6) Triplets 操作: DG_CONTROL /DAT_EVENT / MSG_PROCESSEVENT 首先要說明一下,從狀態(tài) 5到狀態(tài) 6的這個過程,不是由你的應用程序通過 Triplets 操作來發(fā)起的。而是當 Source 準備好去傳輸數(shù)據(jù)時,它會發(fā)出一個事 件信號來實現(xiàn)的。你的應用程序應該要去檢查這個事件信號。 如何去檢查這個事件信號?我們在加載 Source Manager時,就為Source指定了 一個父窗口,Source會把它事件信號封裝成一個 Windows的消息結構發(fā)送給它 的父窗口。你可以在這個窗 體的消息循環(huán)中去, 使用 DG_CON

32、TRO/DLAT_EVENT/ MSG_PROCESSEV操作,來判斷Source是否有事件發(fā)生。MSG_XFERREA就表 示這個過程的狀態(tài)位從 5 變?yōu)?6 了。 8開始進行數(shù)據(jù)傳輸 ( 狀態(tài) 6 到 7) Triplets 操作:DGMAGE / DAT_IMAGEINFO / MSG_GET DG_IMAGE / DAT_IMAGENATIVEXFER / MSG_GET 在開始數(shù)據(jù)傳輸前,可以通過DG_IMAGE / DAT_IMAGEINFO / MSG_G操作, 去獲得將要傳輸?shù)膱D像的相關信息,比如位圖大小、寬度、長度。 通過 DG_IMAGE / DAT_IMAGENATIVE

33、XFER / MSG_GE作,可以實現(xiàn)使用本地 傳輸模式去傳輸數(shù)據(jù)。傳輸結束了, Source 將給它的父窗口一個 PM_XFERDONE 的消息。Source將在DSM_Entry()中返回為一個指向DIB位圖的指針。 9中止傳輸 ( 狀態(tài) 7到6到5) Triplets 操作: DG_CONTROL / DAT_PENDINGXFERS / MSG_ENDXFER 在每次數(shù)據(jù)傳輸結束(成功、退出)后,可以發(fā)送該操作給Source,去表示應用 程序已經(jīng)接受完了所有的數(shù)據(jù)了。 同時還可以根據(jù)它的返回值, 去檢查是否有其 它的圖像等待傳送。 10.斷開TWAIN會話(狀態(tài)5到4) Triplet

34、s 操作: DG_CONTROL / DAT_USERINTERFACE / MSG_DISABLEDS 該操作讓打開 Source 失效。 11.關閉 Source ( 狀態(tài) 4到 3) Triplets 操作: DG_CONTROL / DAT_IDENTITY / MSG_CLOSEDS 該操作可以關閉指定的 Source。 12關閉 Source Manager( 狀態(tài) 3 到 2) Triplets 操作: DG_CONTROL / DAT_PARENT/MSG_CLOSEDSM 關閉打開的 Source Manager 。 七、TWAIN的數(shù)據(jù)傳輸模式 TWAIN定義了三種模式用于

35、Source到Application 的數(shù)據(jù)傳輸:本地模式、 文件模式 , 和緩存模式。現(xiàn)在對每種模式進行一個簡單的介紹。 注:對于音頻數(shù)據(jù)的傳輸,只能選擇本地模式或者文件模式來進行傳輸。 本地模式 所有的輸入設備都支持這種本地數(shù)據(jù)傳輸模式,同時它也是TWAIN默認的數(shù) 據(jù)傳輸模式,并且它還是最容易使用的數(shù)據(jù)傳輸模式。 但是,它有一定的局限性, 它傳輸?shù)臄?shù)據(jù)必須是 DIB 圖像數(shù)據(jù),并且在傳輸時,會受到系統(tǒng)內(nèi)存大小限制。 傳輸數(shù)據(jù)的格式 :DIB (Device-Independent Bitmap) 使用該模式,在數(shù)據(jù)傳輸時 Source 分配一塊單獨的內(nèi)存區(qū)域,并把圖形數(shù) 據(jù)寫入這個內(nèi)存區(qū)

36、域內(nèi)。然后它通過一個指向該內(nèi)存地址的指針告訴 Application ,數(shù)據(jù)存放在什么地方。 你的應 用程序通過訪問該內(nèi)存區(qū)域去獲得 具體的圖像數(shù)據(jù)。 注意, Application 在獲得數(shù)據(jù)后要負責去釋放這部分的內(nèi)存。 如果你的圖像數(shù)據(jù)大于系統(tǒng)當前可用 內(nèi)存,會導致傳輸失敗。 文件模式 該模式是讓 Application 創(chuàng)建一個文件,這個文件用于儲存?zhèn)鬏數(shù)臄?shù)據(jù), Source 將對該文件進行讀寫操作。 Source 將把要傳輸?shù)臄?shù)據(jù)寫到該文件中,你 的應用程序通過訪問該文件,就可以獲得傳輸?shù)臄?shù)據(jù)。 在使用本地模式傳輸一個大的圖像文件時,如果內(nèi)存不夠大,可以考慮使用 文件傳輸模式來傳輸。

37、文件傳輸模式與緩存?zhèn)鬏斈J较啾龋?在使用方法上要簡單 些,但是該模式在傳輸速度上比緩存模式的傳輸速度要慢一些, 并且在數(shù)據(jù)傳輸 完畢后,你的應用程序還必須去管理這個數(shù)據(jù)文件。 緩存模式 緩存模式在整個傳輸過程中,將使用一個或多個內(nèi)存緩存區(qū),內(nèi)存緩存區(qū)的 分配和釋放工作由 Application 來控制。在傳輸過程中, 傳輸數(shù)據(jù)被當作一個未 知格式的位圖。Application 必須使用TW_IMAGEINF和TW_IMAGEMEMX操作, 去得到各個緩存區(qū)的信息并把它們正確組織為一個完整的位圖。 如果使用本地模式 或 文件模式 去傳輸數(shù)據(jù),整個傳輸過程在只需要一個 Triplets 操作就可以

38、完成。如果使用 緩存模式 傳輸數(shù)據(jù) , 你的應用程序可能 需要使用多個 Triplets 操作,不停地去獲得緩存區(qū)的數(shù)據(jù)信息。但是,該傳輸 模式具有很好的靈活性 , 可以很好的去控制獲得的數(shù)據(jù), 只不過在編程應用上要 麻煩一些。 八、TWAIN的應用實現(xiàn) 好了,看了前面的對TWAIN勺介紹,現(xiàn)在我們就動手開始進行實際的編程吧。 在這里,只進行一個最簡單的應用實現(xiàn)。 我們的應用程序不去設置設備的性能參 數(shù),不選擇其它數(shù)據(jù)傳輸模式,僅僅使用TWAIN勺默認的本地傳輸模式方式,去 獲得圖像數(shù)據(jù)。 在進行實際編程應用前,我們可以先安裝 TWAIN提供的工具包。它不僅提供了 TWAIN應用的例程,還可以

39、在你的計算機系統(tǒng)上安裝一個虛擬的圖像輸入設備 (TWAIN_32 Sample Source ) 。這對于沒有掃描儀、數(shù)碼相機的開發(fā)者,提供了 一個很好的測試設備。TWAINX具包的下載地址: /devfiles/twainkit.exe 。 由于TWAIN目前提供的是基于C的編程接口,所以我們這里采用 VC作為開發(fā)工 具。我們可以建一個自己的 TWAIN類。把一些Triplets 操作封裝成這個類的成 員函數(shù)。以便于程序調(diào)用。記住:在你的項目中要加入TWAIN提供的頭文件。 前面已經(jīng)介紹了,在進行TWAIN的操作前,如何加載TWAIN_32.dll文件,

40、獲得 DSM_Entry()函數(shù)指針。下面僅簡單介紹一下其他的成員函數(shù)。 1 打開 Source Manager int CTwain:OpenSourceManager(void) TW_UINT16 rc; / lpDSM_Entry 是指向DSM_Entry的函數(shù)指針 rc = (*lpDSM_Entry) ( switch (rc)/ 檢查打開 Source Manager 是否成功 case TWRC_SUCCESS: / 成功 case TWRC_CANCEL: 2打開 Source int CTwain:OpenSource( void ) TW_UINT16 rc; rc = (*lpDSM_Entry) (/ SourceID 是要求打開 Source switch (rc) / 檢查打開 Source Manager 是否成功 case TWRC_SUCCESS/: 成功 3處理

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論