Twain 学习纪录
一、TWAIN的文件組成
TWAIN共包括4個二進制文件。如果要使用該接口,就必須要保證他們被成功地安裝在本地計算機上。
?
| 文 件 名 | 說 明 |
| TWAIN_32.DLL | 32位應(yīng)用程序的支持文件,32位程序使用TWAIN通訊必須使用該文件。 |
| TWAIN.DLL | 16位應(yīng)用程序的支持文件,16位程序使用TWAIN通訊必須使用該文件。 |
| TWUNKER_32.EXE | 實現(xiàn)32位應(yīng)用程序與32位數(shù)據(jù)源進行通訊,它運行時不可見。 |
| TWUNKER_16.EXE | 實現(xiàn)32位應(yīng)用程序與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)對TWAIN的訪問,還需要最重要的頭文件。你通過訪問該http://www.twain.org/devfiles/twain.h 地址來獲得TWAIN提供的頭文件。
?
二、TWAIN的結(jié)構(gòu)
TWAIN依靠三個組件協(xié)同完成與圖像設(shè)備的通訊和數(shù)據(jù)傳輸工作,這三個組件就是 Application、Source Manager和Source。
?
| 組件 | 說明 |
| Application | 就是你要編寫的應(yīng)用程序。 |
| Source Manager | 是由TWAIN提供的一個Source的管理器,它不僅可以收集本地系統(tǒng)已經(jīng)安裝了的圖像設(shè)備,還可以根據(jù)需要去加載設(shè)備。同時,它最重要的功能是擔(dān)任Application 與Source通訊的橋梁。(其實,它就是我們前面提到的組成文件中的dll文件。) |
| Source | 在這里可以看作是圖像設(shè)備。事實上它是由設(shè)備廠家提供的一個dll文件。這個dll文件是支持twain接口的。(該文不討論關(guān)于twain在Source中的應(yīng)用。) |
?
它們的層次結(jié)構(gòu)圖如下:
?
?
?
從該圖我們可以看到,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)(在這里,我們不用關(guān)心Source Manager如何去調(diào)用DS_Entry函數(shù)。
?
三、TWAIN的用戶界面
當(dāng)我們使用TWAIN接口去獲得圖像數(shù)據(jù)的時候,會涉及到一些的用戶界面,首先是我們的應(yīng)用程序界面,然后是Source Manager提供的用戶界面以及圖像設(shè)備(Source)所提供的用戶界面。
?
在我們的應(yīng)用程序中,可以通過“選擇設(shè)備”來打開Source Manager的標(biāo)準(zhǔn)用戶界面。Source Manager的界面由Source Manager提供。在這個界面中可以讓用戶選擇他想要使用的圖像設(shè)備。選中想要的設(shè)備后,再通過“獲取…”來打開圖像設(shè)備(Source)提供的用戶界面進行現(xiàn)應(yīng)的操作。(注:Source提供的界面會因為你使用的圖像設(shè)備不同而有差異。)
對于這些界面,TWAIN提供了非常靈活的處理方法。對于Source Manager提供的用戶界面以及圖像設(shè)備(Source)所提供的用戶界面,我們可以選擇是否顯示它們,甚至我們還可以按自己的要求去改寫這些用戶界面。
?
四、TWAIN的接口函數(shù)
要編寫應(yīng)用程序?qū)崿F(xiàn)與支持TWAIN標(biāo)準(zhǔn)的圖像設(shè)備通訊,只需要了解上面提到的DSM_Entry()接口函數(shù)。TWAIN定義了大約140個操作消息。你只要把這些消息通過DSM_Entry()函數(shù)發(fā)給Source Manager,就可以實現(xiàn)對選定的Source進行相應(yīng)的操作。Source Manager會分辨那些消息屬于自己,那些消息是該轉(zhuǎn)發(fā)給Source。
在介紹DSM_Entry()前,我們先來了解一下的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.H中都有定義。其他的操作(設(shè)置掃描儀的分辨率、獲得設(shè)備支持的功能等等…)你可以去查看TWAIN的參考手冊,我將在后面編程應(yīng)用中介紹幾個最常用的操作。
現(xiàn)在,我們明白了TWAIN定義的Triplets操作,但是這還不夠。在使用DSM_Entry()前,必須要加載TWAIN_32.DLL文件以獲得DSM_Entry()函數(shù)指針。(注意:在你程序中應(yīng)該添加前面提到的TWAIN.H頭文件哦!)
DSMENTRYPROC lpDSM_Entry;???//* DSM_Entry 入口函數(shù)的指針
HMODULE??????hDSMDLL;???????//* Twain_32.Dll句柄
????……
//* 加載TWAIN_32.DLL 文件
if ((hDSMDLL = LoadLibrary("TWAIN_32.DLL")) != NULL)
{
????if (hDSMDLL)???????????//* 檢查TWAIN_32.DLL是否加載
????{
????????????if ( (lpDSM_Entry =(DSMENTRYPROC) GetProcAddress(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,????????//* 指向操作發(fā)起者的指針
pTW_IDENTITY pDest,??????????//* 指向目標(biāo)對象的指針
TW_UINT32 DG,????????????????//* Triplets 操作的DG參數(shù) : DG_xxxx
TW_UINT16 DAT,???????????????//* Triplets 操作的DAT參數(shù): DAT_xxxx
TW_UINT16 MSG,???????????????//* Triplets 操作的MSG參數(shù): MSG_xxxx
TW_MEMREF pData??????????????//* 指向返回數(shù)據(jù)塊的指針
);
????其中DG、DAT、MSG參數(shù)表示一個你想執(zhí)行的Triplets操作。pOrigin表示發(fā)起Triplets操作的對象。pDest表示接收Triplets操作的對象。pData用于獲得執(zhí)行Triplets操作后返回的數(shù)據(jù)。
????對于每個Triplets操作,都是由DG、DAT、MSG三個參數(shù)組合構(gòu)成的。pOrigin、pDest參數(shù)會根據(jù)不同的Triplets操作,而使用不同的值。
函數(shù)執(zhí)行后會返回一個值來表示操作是否成功。如果返回值為TWRC_SUCCESS表示操作成功,TWRC_FAILURE表示操作失敗。同樣根據(jù)Triplets操作的類型不同,還會有其他的返回值。比如TWRC_CANCEL、TWCC_LOWMEMORY…,具體信息你可以參考TWAIN的說明手冊。
???
五、TWAIN的操作流程
?
Application、 Source Manager 和 Source要實現(xiàn)數(shù)據(jù)傳輸,必須遵循一個操作流程。你要進行的操作應(yīng)該在這個流程規(guī)定的動作隊列中按邏輯去執(zhí)行。比如,在沒有加載Source Manager前,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 的標(biāo)志位是不會大于3的.
狀態(tài)位4, 5, 6, 7
這幾個狀態(tài)是Source專有的。如果Source打開了,Source 的標(biāo)志位就不會小于4;如果Source關(guān)閉了,Source就沒有了標(biāo)志位。
?
要注意,我們的應(yīng)用程序可以使用了多個Source,每個與Source的連接都是一個單獨的會話,對于打開的每個Source,他們的標(biāo)志位都是相互獨立的,不互相關(guān)聯(lián)?,F(xiàn)在就來看看流程圖。
流程標(biāo)志位說明
狀態(tài) 1 – 準(zhǔn)備會話
在Application和Source Manager建立會話前,Source Manager的標(biāo)志位是1.
在這個時候,Source Manager還沒有被加載到內(nèi)存中。如果Source Manager 被加載到內(nèi)存中,則狀態(tài)位是2或者3。
?
狀態(tài)2 –加載Source Manager
Source Manager現(xiàn)在已經(jīng)被成功地加載到了程序中,但是沒有打開Source Manager。
在這個時候, Source Manager開始準(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)閉時,Source Manager 會拒絕關(guān)閉。
?
狀態(tài) 4 – 打開Source?????
在響應(yīng)Application的一個指定的Triplets操作后,Source被加載到系統(tǒng)中,并且被Source manager 打開。Source在加載前將檢測是否有足夠的系統(tǒng)資源讓自己運行(內(nèi)存、設(shè)備是否可用等等…)。 Application不僅可以查詢Source的性能參數(shù)(當(dāng)前解析度、是否支持彩色或黑白圖像、自動文檔傳送是否可用), Application還可以去設(shè)置的Source的性能參數(shù)。比如,Application可以要求Source按指定的分辨率傳輸黑白圖像。
?
注意: 可以在Source的狀態(tài)位是4, 5, 6, 或 7時,去查詢Source的性能參數(shù)。但是要想設(shè)置Source的性能參數(shù)必須在狀態(tài)位是4的時候設(shè)置,除非Application和Source有特殊的約定,否則在標(biāo)志位為其他數(shù)的時候都不可以進行性能參數(shù)設(shè)置。
?
狀態(tài) 5 – Source可用?????????
現(xiàn)在可以讓Source工作了,此時Source開始為數(shù)據(jù)傳輸做準(zhǔn)備。在該狀態(tài)下,可以執(zhí)行一個Triplets操作,用以選擇是否讓Source顯示它自己的用戶界面(Source提供的軟件界面)。當(dāng)Source準(zhǔn)備好給Application傳輸數(shù)據(jù)時,標(biāo)志位就從5變?yōu)?了。
?
狀態(tài) 6 –準(zhǔn)備數(shù)據(jù)傳輸
該狀態(tài)下,Source已經(jīng)準(zhǔn)備好了為Application傳輸數(shù)據(jù)。在傳輸工作開始前,Application應(yīng)該查詢將要被傳輸?shù)膱D像的相關(guān)信息(分辨率,圖像大小…), 如果Source還要傳輸音頻數(shù)據(jù), 那么在傳輸圖像數(shù)據(jù)前,Application必須要把所有的音頻數(shù)據(jù)先傳完。注:某些數(shù)碼相機帶有攝像功能,可以記錄一些聲音信息。
?
狀態(tài) 7 –傳輸開始???????
Source開始進行數(shù)據(jù)傳輸,它把獲得的數(shù)據(jù)傳輸給你的應(yīng)用程序。 傳輸工作要么成功完成,要么提前中止。在傳輸工作完成后, Source將會發(fā)送一個返回代碼去表示傳輸工作的最終結(jié)果。
?
?
轉(zhuǎn)載于:https://blog.51cto.com/chujiu/851917
總結(jié)
以上是生活随笔為你收集整理的Twain 学习纪录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 英雄联盟云顶之奕6贵族搭配什么 英雄资料
- 下一篇: 机房网络 与 LVS