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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

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

2、的(說實(shí)在話,我個(gè)人覺得TWAIN接口設(shè)計(jì)得太差了,看看 MS的WIA,邏輯上非常清晰)。這個(gè)函數(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是一個(gè)數(shù)據(jù)源管理程序,應(yīng)用程序首先要使用MSG_OPENDSM 消息,打開數(shù)據(jù) 源管理器。這里需要指定一個(gè)窗口句柄,應(yīng)用程序應(yīng)該在此窗口的消息循環(huán)中處理TWAIN 消息(MSG_PROCESSEVENT)。 2. 選擇 DS (Data Source: 數(shù)據(jù)源 ) 因?yàn)橐粋€(gè)系統(tǒng)中可能存在多個(gè) TWAIN 設(shè)備,因此必須選擇一個(gè)數(shù)據(jù)源。選擇數(shù)據(jù)源通常 有兩種方式 : 選擇默認(rèn)數(shù)據(jù)源 (MSG_GETDEFAULT) 和顯示選擇數(shù)

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

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

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

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

8、elper 就碰到過這樣的情況在虛擬TWAIN 設(shè)備中明明是好的,在我 的掃描儀上卻不能掃描圖像。檢查后發(fā)現(xiàn),原來設(shè)置了不支持的參數(shù)。 最后,TWAIN 是 Technology Without A Interesting Name縮寫,直譯為沒有 沒有讓人感 興趣名字的技術(shù)”,真是一個(gè)讓人摸不著頭腦的名字。 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對話框完全關(guān)閉后才會返回,適合任何場合使用: 下載文件 點(diǎn)擊這里下載文件 轉(zhuǎn)Twain 學(xué)習(xí) 2009-05-03 11:34:07| 分類:C語言學(xué)習(xí)|字號訂閱 一、TWAIN的文件組成 TWAIN共包括4個(gè)二進(jìn)制文件。如果要使用該接口,就必須要保證他們被成 功地安裝在本地計(jì)算機(jī)上。 文件名

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

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

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

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

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

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

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

17、必須要加載TWAIN_32.DLL文件以獲得DSM_Entry()函數(shù)指針。 (注意:在你程序中應(yīng)該添加前面提到的 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ù)來實(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ā)起者的指針 /* 指向目標(biāo)對象的指針 /* Triplets 操作的 DG參 /* Triplets操作的 DAT參 /* Triplets操作的 MSG參 /* 指向返回?cái)?shù)據(jù)塊的指針 ); 其中DG DAT MSG參數(shù)表示一個(gè)你想執(zhí)行的Triplets 操作。pOrigin 表示發(fā)起 Triplets 操作的對象。 pDest 表示接收 Triplets 操作的對象。 pData 用于獲得執(zhí)行 Triplets 操作后返回的數(shù)據(jù)。 對于每個(gè)Triplets 操作,都是由DG DAT MSGE個(gè)參數(shù)組合構(gòu)成的。 pOrigin pDest 參數(shù)會根據(jù)不同的 Triplets 操

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

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

22、打開的每個(gè)Source,他們的標(biāo)志位都是相互獨(dú)立的,不互相 關(guān)聯(lián)?,F(xiàn)在就來看看流程圖。 流程標(biāo)志位說明 狀態(tài)1 -準(zhǔn)備會話 在 Application 和 Source Manager 建立會話前, Source Manager 的標(biāo)志位 是 1. 在這個(gè)時(shí)候,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。 在這個(gè)時(shí)候 , Source Manager

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

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

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

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

27、操作做一個(gè)簡單的介紹,為了便于理解和 記憶,我將結(jié)合前面講的操作流程順序去介紹這些常用的 Triplets 操作。 1 .加載Source Manager并獲得DSM_Entry入口函數(shù)(狀態(tài)1到2) 應(yīng)用程序在調(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,并且還要在你的應(yīng)用程序中,指定 一個(gè)窗體作為 Source 的父窗口。 Source Manager 將通過該窗體,把 Source 的 消息傳遞給你的應(yīng)用程序。 3. 選擇 Source ( 狀態(tài) 3 期間 ) Triplets 操作: DG_CONTROL / DAT_IDENTITY / MSG_USERSELECT 你的應(yīng)用程序發(fā)送該操作后,將顯示 Source Manager 的用戶界面,它是一個(gè)對 話框。這個(gè)對話框中顯示了系統(tǒng)中所有支持 Twain 的設(shè)備列表。 系統(tǒng)默認(rèn)設(shè)備將 高亮

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

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

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

32、TRO/DLAT_EVENT/ MSG_PROCESSEV操作,來判斷Source是否有事件發(fā)生。MSG_XFERREA就表 示這個(gè)過程的狀態(tài)位從 5 變?yōu)?6 了。 8開始進(jìn)行數(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像的相關(guān)信息,比如位圖大小、寬度、長度。 通過 DG_IMAGE / DAT_IMAGENATIVE

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

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

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

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

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

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

39、在你的計(jì)算機(jī)系統(tǒng)上安裝一個(gè)虛擬的圖像輸入設(shè)備 (TWAIN_32 Sample Source ) 。這對于沒有掃描儀、數(shù)碼相機(jī)的開發(fā)者,提供了 一個(gè)很好的測試設(shè)備。TWAINX具包的下載地址: /devfiles/twainkit.exe 。 由于TWAIN目前提供的是基于C的編程接口,所以我們這里采用 VC作為開發(fā)工 具。我們可以建一個(gè)自己的 TWAIN類。把一些Triplets 操作封裝成這個(gè)類的成 員函數(shù)。以便于程序調(diào)用。記住:在你的項(xiàng)目中要加入TWAIN提供的頭文件。 前面已經(jīng)介紹了,在進(jìn)行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)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論