掃瞄器驅動軟體程式碼 |
|
領航天使
站長 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
在利用Delphi開發信息管理系統時,常常要處理圖象,這也是信息管理系統發展的必然趨勢。怎樣在 Delphi中通過掃描儀獲得所需的圖象信息呢?不外乎有三種基本的方法: 通過圖象處理軟件,比如說Photoshop等,通過它們的掃描圖象的功能,加工成一定格式的圖象后再在自己 的系統中利用﹔ 通過掃描儀接口Twain.DLL。該接口是在安裝掃描儀時提供的,它實際上是一個Plugin插件,它通過一系列 函數來控制掃描儀﹔ 通過構件技朮來控制掃描儀。 利用第一種方法能減少編程的復雜度,但是系統的集成度不高,用戶使用上也不方便﹔第二種方法能在驅動 程序級直接控制掃描儀,能 在編程上提供最大的靈活性和可控性﹔第三種方法能充分利用Delphi的可視化構件技朮,安全、靈活、自由 地利用掃描儀。其實第三種方法也是建立在掃描儀接口Twain.DLL之上的。本文論述的方法就采用第三種。 Windows9X在其附件中提供了“映象”可選件,該附件是采用OCX構件來控制掃描儀的,共有imgEdit、 imgAnntool、imgScan、imgAdmin 四個,有這四個構件基本上就能完全控制掃描儀。在Delphi中的用法如 下: 在Windows9x中選擇安裝“映象”。(在控制面板中選擇“添加/刪除程序”,再選擇“安裝Windows ”,點擊“附件”復選框,然后從“詳細資料”按鈕中可以找到“映象”) 啟動Delphi,選擇“Component”菜單項下的“Import ActiveX Control”,這時可以看到列表中有“ Wang 圖象編輯控制、Wang 圖象掃描控制、Wang圖象管理控制、Wang 圖象縮略圖控制”,選中這四項,然 后點擊“Install”按鈕,這時在構件面板上的ActiveX舌標下就可以看到這四個構件的圖標。 ImgScan的主要屬性:FileType:圖象的文件類型(該構件支持三種:TIFF,BMP,AWD)﹔ ScanTo:返回或設置被掃描圖象的目的﹔ 可取值 含義 0 (缺省) 顯示被掃描的圖象. 1 顯示被掃描的圖象并寫入一個文件. 2 把圖象寫入一個文件 3 以模板方式把圖象寫入文件并顯示. 4 . 以模板方式把圖象寫入文件 5 傳真被掃描的圖象 注意:如果取缺省值0, 必須和 Wang ImgEdit 構件配合使用。 DestImageControl:Wang ImgEdit構件名﹔ Zoom:圖象的放縮比例 ImgScan 的主要方法:OpenScanner :打開掃描儀﹔ CloseScanner :關閉掃描儀﹔ StartScan : 開始掃描﹔ StopScan : 停止掃描 ImgEdit的屬性主要是控制掃描圖象的分辨率、圖象的寬高、是否允許對圖象進行局部選 擇等﹔其方法主要 有拷貝、剪切圖象到粘貼板,從粘貼板復制圖象,旋轉、放縮、 鏡象圖象﹔打印、保存、刷新圖象等。 關于上述四個OCX構件的詳細使用說明可在Delphi中查看其自帶的幫助系統。 下面是使用這兩個構件的一些例子: procedure Tscanf.N1Click(Sender: Tobject); begin ImgScan1.ShowSelectScanner; //選擇系統中已安裝的掃描儀 end; procedure Tscanf.N2Click(Sender: Tobject); begin imgedit1.zoom:=100; //設置圖象的放縮因子 if not imgscan1.ScannerAvailable then //如果選擇的掃描儀不可用 imgscan1.OpenScanner;//打開掃描儀 imgscan1.StartScan; //開始掃描圖象 imgscan1.CloseScanner; //關閉掃描儀 end; procedure Tscanf.N8Click(Sender: Tobject); begin if (imgedit1.IsClipboardDataAvailable and imgedit1.ImageDisplayed ) then imgedit1.ClipboardPaste(selleft,seltop); //從剪貼板粘貼圖象,其參數為Imgedit的顯示區域的起始坐標 end; procedure Tscanf.N1801Click(Sender: Tobject); begin if imgedit1.ImageDisplayed then imgedit1.Flip; //鏡象圖象 end; procedure Tscanf.N901Click(Sender: Tobject); begin if imgedit1.ImageDisplayed then imgedit1.RotateRight //向右旋轉圖象 end; procedure Tscanf.N6Click(Sender: Tobject); begin imgedit1.DrawSelectionRect(selleft, seltop,selwidth,selheight);//進行圖象局部選擇 imgedit1.ClipboardCut(selleft,seltop, selwidth,selheight);//剪切所選區域 end; ---- 注意:在DELPHI中使用Imgedit構件的拷貝和剪切功能時,會出現 以下問題: ---- 1、 如果把整幅圖象都選中,沒有任何問題﹔ ---- 2、 如果選擇了局部區域,則拷貝和剪切的區域會發生漂移﹔ ---- 3、 如果DELPHI做的是MS SQL后端數據庫的客戶端界面,那么在把 圖象內容寫入數據庫的圖象字段中時,BDE(數據庫引擎)會報錯。這是 DELPHI3。0和4。0的BUG,4。0的升級包可以解決這個問題。 ---- 至于第二個問題,可這樣解決:在Imgedit的onSelectionRectDrawn 事件中寫一段代碼,把選擇區域的邊界值保存到四個全局變量中,在拷貝 和剪切之前用先前保存的變量再進行一次選擇即可(當然,這一切都在后 台進行的,見前面的例子)。 ---- 開發環境:DELPHI4。0,HP ScanJet 4P掃描儀﹔ ---- 附源代碼。 unit scanu; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus, ScanLib_TLB, ExtCtrls, AxCtrls, OleCtrls, ImgeditLib_TLB; type Tscanf = class(Tform) MainMenu1: TMainMenu; F1: TMenuItem; N15: TMenuItem; N1: TMenuItem; N2: TMenuItem; N16: TMenuItem; N11: TMenuItem; N5: TMenuItem; C1: TMenuItem; N4: TMenuItem; E1: TMenuItem; N6: TMenuItem; N7: TMenuItem; N8: TMenuItem; N3: TMenuItem; N10: TMenuItem; N9: TMenuItem; N1801: TMenuItem; N901: TMenuItem; N902: TMenuItem; H1: TMenuItem; N12: TMenuItem; N13: TMenuItem; ImgEdit1: TImgEdit; Bevel1: Tbevel; ImgScan1: TImgScan; Bevel2: Tbevel; procedure N4Click(Sender: Tobject); procedure N1Click(Sender: Tobject); procedure N2Click(Sender: Tobject); procedure C1Click(Sender: Tobject); procedure N8Click(Sender: Tobject); procedure N1801Click(Sender: Tobject); procedure N901Click(Sender: Tobject); procedure N902Click(Sender: Tobject); procedure N6Click(Sender: Tobject); procedure N7Click(Sender: Tobject); procedure ImgEdit1SelectionRectDrawn(Sender: Tobject; Left,Top, Width, Height: Integer); procedure N11Click(Sender: Tobject); private { Private declarations } public selleft,seltop,selwidth,selheight:integer; { Public declarations } end; var scanf: Tscanf; implementation {$R *.DFM} procedure Tscanf.N4Click(Sender: Tobject); begin imgedit1.ClearDisplay; close; end; procedure Tscanf.N1Click(Sender: Tobject); begin ImgScan1.ShowSelectScanner; end; procedure Tscanf.N2Click(Sender: Tobject); begin imgedit1.zoom:=100; if not imgscan1.ScannerAvailable then imgscan1.OpenScanner; imgscan1.StartScan; imgscan1.CloseScanner; end; procedure Tscanf.C1Click(Sender: Tobject); begin if imgedit1.ImageDisplayed then begin imgedit1.ClearDisplay; imgedit1.zoom:=100; end; end; procedure Tscanf.N8Click(Sender: Tobject); begin if (imgedit1.IsClipboardDataAvailable and imgedit1.ImageDisplayed ) then imgedit1.ClipboardPaste(selleft,seltop); end; procedure Tscanf.N1801Click(Sender: Tobject); begin if imgedit1.ImageDisplayed then imgedit1.Flip; end; procedure Tscanf.N901Click(Sender: Tobject); begin if imgedit1.ImageDisplayed then imgedit1.RotateRight end; procedure Tscanf.N902Click(Sender: Tobject); begin if imgedit1.ImageDisplayed then imgedit1.RotateLeft; end; procedure Tscanf.N6Click(Sender: Tobject); begin imgedit1.DrawSelectionRect(selleft,seltop,selwidth,selheight); imgedit1.ClipboardCut(selleft,seltop,selwidth,selheight); end; procedure Tscanf.N7Click(Sender: Tobject); begin imgedit1.DrawSelectionRect(selleft,seltop,selwidth,selheight); imgedit1.ClipboardCopy(selleft,seltop,selwidth,selheight); end; procedure Tscanf.ImgEdit1SelectionRectDrawn(Sender: Tobject; Left, Top, Width, Height: Integer); begin if ((width=0) and (height=0))then begin n3.Enabled:=false; n6.Enabled:=false; n7.Enabled:=false; selleft:=left; seltop:=top; selwidth:=width; selheight:=height; end else begin n6.Enabled:=true; n7.Enabled:=true; selleft:=left; seltop:=top; selwidth:=width; selheight:=height; end; end; procedure Tscanf.N11Click(Sender: Tobject); begin if not imgedit1.IsClipboardDataAvailable then if imgedit1.imagedisplayed then imgedit1.ClipboardCopy(0,0,imgedit1.Width,imgedit1.Height); end; end.
------
~~~Delphi K.Top討論區站長~~~ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |