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

下載本文檔

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

文檔簡介

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

2、導出的 DSM_Entry 函數(shù)來實現(xiàn)的 (說實在話,我個人覺得 TWAIN 接口設計得太差了,看看 MS 的WIA,邏輯上非常清晰)。這個函數(shù)的聲明如下: TW_UINT16 FAR PASCAL DSM_Entry(pTW_IDENTITY pOrigin, / Source of messagepTW_IDENTITY pDest, / Destination of messageTW_UINT32 DG, / Data group ID: DG_xxxxTW_UINT16 DAT, / Data argument type: DAT_xxxxTW_UINT16 MSG, /

3、Message ID: MSG_xxxxTW_MEMREF pData / Pointer 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ù)源通常有兩

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

5、。此時,應用程序可以通過 DAT_SETUPFILEXFER 設置文件名,然后用 DAT_IMAGEFILEXFER 獲取圖像到文件中。 7. 關閉掃描界面 在窗口的消息循環(huán)中獲取到 MSG_CLOSEDSREQ 或 MSG_CLOSEDSOK 消息,可以關閉掃描界面 (MSG_DISABLEDS)。 8. 關閉 DS 消息為 MSG_CLOSEDS。 9. 關閉數(shù)據(jù)源消息為 MSG_CLOSEDSM。 三、CTwainHelper 助手類為了使用方便,我寫了一個靜態(tài) TWAIN 助手類 CTwainHelper。使用 CTwainH

6、elper 的五個函數(shù),就可以簡單地從 TWAIN 設備獲取圖像到文件中。使用方法如下:1. 調(diào)用 CTwainHelper:Initialize() 確定是否有可用的設備。2. 在窗口消息循環(huán)中,調(diào)用 CTwainHelper:ProcessMessage() 處理 TWAIN 消息。3. 要獲取圖像時,調(diào)用 CTwainHelper:GetImage()。4. 如果圖像已準備好 (如用戶確定掃描圖像),窗口會收到 WM_COMMAND 消息,wParam 為 IDC_TwainHelper。此時應用程序可以調(diào)用 CTwainHelper:TransferImage() 獲取圖像到文件中。具

7、體使用方法請參看示例代碼。CTwainHelper 可以在 Visual C+ 6.x/7.x 工程中使用,支持 UNICODE 編譯。因為是靜態(tài)類,要改寫成 C 代碼只需要做一點點少量的工作。四、后話當然,上面只是一種常用的步驟。其實應用程序完全可以自定義所有的步驟,比如不使用 TWAIN 驅動提供掃描對話框而直接掃描,或者掃描圖像到內(nèi)存中等等。詳細情況請參考 TWAIN Specification,步驟大同小異,消息和參數(shù)千差萬別,仔細看看應該很容易的。如果沒有 TWAIN 設備又要進行 TWAIN 程序開發(fā),可以到 TWAIN 官方網(wǎng)站下載 TWAIN Developers Toolki

8、t,安裝后會有一個虛擬的 TWAIN 設備。不過應用程序在這個虛擬 TWAIN 設備中正常工作,不代表一定能在實際的 TWAIN 設備正常使用,這點需要注意。以前 CTwainHelper 就碰到過這樣的情況 在虛擬 TWAIN 設備中明明是好的,在我的掃描儀上卻不能掃描圖像。檢查后發(fā)現(xiàn),原來設置了不支持的參數(shù)。最后,TWAIN 是 Technology Without A Interesting Name 縮寫,直譯為沒有“沒有讓人感興趣名字的技術”,真是一個讓人摸不著頭腦的名字。TWAIN 助手類: CTwainHelper (包含示例代碼 35K)TWAIN 官方網(wǎng)站

9、: TWAIN 頭文件: /devfiles/twain.hTWAIN Specification: /docs/Spec1_9_197.pdfTWAIN Developers Toolkit: /devfiles/twainkit.exe 2006.2.22 下面是更簡單的版本,其中的 GetImage 函數(shù)內(nèi)部自動具有消息循環(huán),直到TWAIN對話框完全關閉后才會返回,適合任何場合使用:下載文件點擊這里

10、下載文件轉 Twain學習  2009-05-03 11:34:07|  分類: C語言學習|字號 訂閱一、TWAIN的文件組成TWAIN共包括4個二進制文件。如果要使用該接口,就必須要保證他們被成功地安裝在本地計算機上。 文 件 名說 明TWAIN_32.DLL32位應用程序的支持文件,32位程序使用TWAIN通訊必須使用該文件。TWAIN.DLL16位應用程序的支持文件,16位程序使用TWAIN通訊必須使用該文件。TWUNKER_32.EXE實現(xiàn)32位應用程序與32位數(shù)據(jù)源進行通訊,它運行時不可見。TWUNKER_16.

11、EXE實現(xiàn)32位應用程序與16位數(shù)據(jù)源進行通訊,它運行時不可見。注意:在Windows NT 環(huán)境下16位數(shù)據(jù)源不能夠正常工作。 在Windows 操作系統(tǒng)中(Windows 9x / 2000 / XP ),Microsoft已經(jīng)把這些文件作為系統(tǒng)文件隨同操作系統(tǒng)一起發(fā)布了。你可以在Windows安裝目錄中查找到這些文件。如果我們要編程來實現(xiàn)對TWAIvN的訪問,還需要最重要的頭文件。你通過訪問該/devfiles/twain.h 地址來獲得TWAIN提供的頭文件。 二、TWAIN的結構TWAIN依靠三個組件協(xié)同完

12、成與圖像設備的通訊和數(shù)據(jù)傳輸工作,這三個組件就是Application、Source Manager和Source。 組件說明Application就是你要編寫的應用程序。Source Manager是由TWAIN提供的一個Source的管理器,它不僅可以收集本地系統(tǒng)已經(jīng)安裝了的圖像設備,還可以根據(jù)需要去加載設備。同時,它最重要的功能是擔任Application 與Source通訊的橋梁。(其實,它就是我們前面提到的組成文件中的dll文件。)Source在這里可以看作是圖像設備。事實上它是由設備廠家提供的一個dll文件。這個dll文件是支持twain接口的。(該文不討論關于

13、twain在Source中的應用。) 它們的層次結構圖如下:  從該圖我們可以看到,Application 要從Source獲得圖像數(shù)據(jù),必須通過Source Manager傳遞來實現(xiàn)。Application與Source Manager 間的通訊是靠調(diào)用TWAIN提供的DSM_Entry( )函數(shù)實現(xiàn)。而Application不能直接與Source 通訊,Source Manager與Source 間的通訊是靠調(diào)用TWAIN提供的DS_Entry( )函數(shù)實現(xiàn)(在這里,我們不用關心Source Manager如何去調(diào)用DS_Entry函數(shù)。 三、TWA

14、IN的用戶界面當我們使用TWAIN接口去獲得圖像數(shù)據(jù)的時候,會涉及到一些的用戶界面,首先是我們的應用程序界面,然后是Source Manager提供的用戶界面以及圖像設備(Source)所提供的用戶界面。在我們的應用程序中,可以通過“選擇設備”來打開Source Manager的標準用戶界面。Source Manager的界面由Source Manager提供。在這個界面中可以讓用戶選擇他想要使用的圖像設備。選中想要的設備后,再通過“獲取”來打開圖像設備(Source)提供的用戶界 面進行現(xiàn)應的操作。(注:Source提供的界面會因為你使用的圖像設備不同而有差異。)對于這些界面,TWAIN提供

15、了非常靈活的處理方法。對于Source Manager提供的用戶界面以及圖像設備(Source)所提供的用戶界面,我們可以選擇是否顯示它們,甚至我們還可以按自己的要求去改寫這些用戶界面。 四、TWAIN的接口函數(shù)要編寫應用程序實現(xiàn)與支持TWAIN 標準的圖像設備通訊,只需要了解上面提到的DSM_Entry()接口函數(shù)。TWAIN定義了大約140個操作消息。你只要把這些消息通過 DSM_Entry()函數(shù)發(fā)給Source Manager,就可以實現(xiàn)對選定的Source進行相應的操作。Source Manager會分辨那些消息屬于自己,那些消息是該轉發(fā)給Source。在介紹DSM_Ent

16、ry() 前,我們先來了解一下的TWAIN定義的消息格式。TWAIN把它定義的操作稱為Triplets操作,就是每個操作用三個定義的參數(shù)來表示。這個三個參 數(shù)用不同前綴名來區(qū)分。每個Triplets操作都是唯一的,不會有歧意,它們代表一個特定的操作行為。這三個參數(shù)類型分別是Data Group(前綴名DG_ )、 Data Argument(前綴名DAT_ ) 和 Message ID(前綴名MSG_ ),每個參數(shù)都包含有各自的信息。比如:DG_CONTROL / DAT_PARENT / MSG_OPENDSM 就表示一個打開Source Manager的操作,這些參數(shù)在TWAIN

17、.H中都有定義。其他的操作(設置掃描儀的分辨率、獲得設備支持的功能等等)你可以去查看TWAIN的參考手冊,我將在后面編程應用中介紹幾個最常用的操作?,F(xiàn)在,我們明白了TWAIN定義的Triplets操作,但是這還不夠。在使用DSM_Entry()前,必須要加載TWAIN_32.DLL文件以獲得DSM_Entry()函數(shù)指針。(注意:在你程序中應該添加前面提到的TWAIN.H頭文件哦!)DSMENTRYPROC lpDSM_Entry;   /* DSM_Entry 入口函數(shù)的指針HMODULE      h

18、DSMDLL;       /* Twain_32.Dll句柄    /* 加載TWAIN_32.DLL 文件if (hDSMDLL = LoadLibrary("TWAIN_32.DLL") != NULL)    if (hDSMDLL)           /* 檢查TWAIN_32.DLL是

19、否加載                if ( (lpDSM_Entry =(DSMENTRYPROC) GetProcAddress(hDSMDLL,MAKEINTRESOURCE(1)!=NULL)                   

20、               /* 成功獲得 DSM_Entry()函數(shù)指針;             現(xiàn)在我們明白了,TWAIN所有的操作都是通過DSM_Entry()函數(shù)來實現(xiàn)的,所以了解該入口函數(shù)很有必要。它定義如下:TW_UINT16 FAR PASCAL DSM_Entry( pTW_IDENTITY pOr

21、igin,        /* 指向操作發(fā)起者的指針pTW_IDENTITY pDest,          /* 指向目標對象的指針TW_UINT32 DG,                /* Triplets 操作的DG參數(shù) : DG_xxxxTW_UI

22、NT16 DAT,               /* Triplets 操作的DAT參數(shù): DAT_xxxxTW_UINT16 MSG,               /* Triplets 操作的MSG參數(shù): MSG_xxxxTW_MEMREF pData   

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

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

25、,Application是不能要求Source傳輸數(shù)據(jù)的。為了更好的去描述這個流程,TWAIN為該流程定義了7個狀態(tài)(1-7)。 狀態(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的連接都是一個單獨的

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

27、tion的Triplets操作。 狀態(tài)3 打開Source ManagerSource 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

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

29、位是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)?了。 狀態(tài) 6 準備數(shù)據(jù)傳輸

30、該狀態(tài)下,Source 已經(jīng)準備好了為Application傳輸數(shù)據(jù)。在傳輸工作開始前,Application應該查詢將要被傳輸?shù)膱D像的相關信息(分辨率,圖像大小), 如果Source還要傳輸音頻數(shù)據(jù), 那么在傳輸圖像數(shù)據(jù)前,Application必須要把所有的音頻數(shù)據(jù)先傳完。注:某些數(shù)碼相機帶有攝像功能,可以記錄一些聲音信息。 狀態(tài) 7 傳輸開始       Source開始進行數(shù)據(jù)傳輸,它把獲得的數(shù)據(jù)傳輸給你的應用程序。 傳輸工作要么成功完成,要么提前中止。在傳輸工作完成后, Source將會發(fā)送一個

31、返回代碼去表示傳輸工作的最終結果。 七、TWAIN最常用的Triplets操作這里將對TWAIN中最常用的Triplets操作做一個簡單的介紹,為了便于理解和記憶,我將結合前面講的操作流程順序去介紹這些常用的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ù)指針&

32、#160;2打開Source Manager (狀態(tài)2到3)Triplets 操作:DG_CONTROL / DAT_PARENT / MSG_OPENDSM通過該操作,你可以打開Source Manager,并且還要在你的應用程序中,指定一個窗體作為Source的父窗口。Source Manager 將通過該窗體,把Source的消息傳遞給你的應用程序。 3選擇Source (狀態(tài)3期間)Triplets 操作:DG_CONTROL / DAT_IDENTITY / MSG_USERSELECT你的應用程序發(fā)送該操作后,將顯示Source Manager的用戶界面,它是一個對話框。

33、這個對話框中顯示了系統(tǒng)中所有支持Twain的設備列表。系統(tǒng)默認設備將高亮顯示在列表框中。你可以通過該列表框選擇你想要的輸入設備。 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

34、_CAPABILITY / MSG_GETDG_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

35、認數(shù)據(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_CONTROL /DAT_EVENT /

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

37、DAT_IMAGENATIVEXFER / MSG_GET 操作,可以實現(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斷開TW

38、AIN會話 (狀態(tài)5到4)Triplets 操作: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ù)傳

39、輸模式TWAIN定義了三種模式用于Source 到Application的數(shù)據(jù)傳輸:本地模式、文件模式,和緩存模式?,F(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ù)傳輸時

40、Source 分配一塊單獨的內(nèi)存區(qū)域,并把圖形數(shù)據(jù)寫入這個內(nèi)存區(qū)域內(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ù)。 在使用本地模式傳輸一個大

41、的圖像文件時,如果內(nèi)存不夠大,可以考慮使用文件傳輸模式來傳輸。文件傳輸模式與緩存?zhèn)鬏斈J较啾龋谑褂梅椒ㄉ弦唵涡?,但是該模式在傳輸速度上比緩存模式的傳輸速度要慢一些,并且在?shù)據(jù)傳輸完畢后,你的應用程序還必須去管理這個數(shù)據(jù)文件。 緩存模式  緩存模式在整個傳輸過程中,將使用一個或多個內(nèi)存緩存區(qū),內(nèi)存緩存區(qū)的分配和釋放工作由Application來控制。在傳輸過程中,傳輸數(shù)據(jù)被當作一個未知格式的位圖。Application必須使用TW_IMAGEINFO 和 TW_IMAGEMEMXFER操作,去得到各個緩存區(qū)的信息并把它們正確組織為一個完整的位圖。 如果

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

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

44、N的操作前,如何加載TWAIN_32.dll文件,獲得DSM_Entry()函數(shù)指針。下面僅簡單介紹一下其他的成員函數(shù)。 1 打開Source Managerint CTwain:OpenSourceManager(void) TW_UINT16 rc;. . ./ lpDSM_Entry 是指向DSM_Entry的函數(shù)指針    rc = (*lpDSM_Entry) (&AppID, NULL,         &

45、#160;                DG_CONTROL,DAT_PARENT,MSG_OPENDSM,                           

46、60;     / hPWnd 是指定為Source的父窗口的句柄                        (TW_MEMREF) & (*hPWnd) ;      switch (rc)   

47、 / 檢查打開Source Manager是否成功          case TWRC_SUCCESS:   /  成功         . . .     case TWRC_CANCEL:       &

48、#160; . . .         . . . 2打開Sourceint CTwain:OpenSource(void)    TW_UINT16 rc;    rc = (*lpDSM_Entry) (&AppID,NULL,             &#

49、160;          DG_CONTROL,DAT_IDENTITY,MSG_OPENDS,                       (TW_MEMREF) &SourceID);  / SourceID 是要求打開Source&#

50、160; switch (rc)    / 檢查打開Source Manager是否成功        case TWRC_SUCCESS: /  成功     . . .          . . . 3處理Source的事件int CTwain:

51、DealSourceMsg(MSG *pMSG)    TW_UINT16  rc    = TWRC_NOTDSEVENT;    TW_EVENT  twEvent;    twEvent.pEvent = (TW_MEMREF) pMSG;    rc = (*lpDSM_Entry) (&AppID,&SourceID, &

52、#160;                     DG_CONTROL,DAT_EVENT,MSG_PROCESSEVENT,                      

53、; (TW_MEMREF) &twEvent);    switch (twEvent.TWMessage)        case MSG_XFERREADY:  / Source準備好傳輸數(shù)據(jù)了 iStatus=6        iStatus=6;       &#

54、160;GetBmpInfo();        DoNativeTransfer();    case MSG_CLOSEDSREQ: / 關閉 Source 用戶界面的申請    case MSG_CLOSEDSOK:     case MSG_NULL:       . .

55、 . 4使用本地模式傳輸數(shù)據(jù)int CTwain:DoNativeTransfer(void)    TW_UINT32  hBitMap = NULL;  / 指向圖像數(shù)據(jù)地址    TW_UINT16  rc;     HANDLE     hbm_acq = NULL;     rc

56、 = (*lpDSM_Entry)(&AppID,&SourceID,                        DG_IMAGE,DAT_IMAGENATIVEXFER,MSG_GET,                      

溫馨提示

  • 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

提交評論