---- 在利用Delphi開(kāi)發(fā)信息管理系統(tǒng)時(shí),常常要處理圖象,這也是信息管理系統(tǒng)發(fā)展的必然趨勢(shì)。怎樣在Delphi中通過(guò)掃描儀獲得所需的圖象信息呢?不外乎有三種基本的方法: 通過(guò)圖象處理軟件,比如說(shuō)Photoshop等,通過(guò)它們的掃描圖象的功能,加工成一定格式的圖象后再在自己的系統(tǒng)中利用;
通過(guò)掃描儀接口Twain.DLL 。該接口是在安裝掃描儀時(shí)提供的,它實(shí)際上是一個(gè)Plugin插件,它通過(guò)一系列函數(shù)來(lái)控制掃描儀;
通過(guò)構(gòu)件技術(shù)來(lái)控制掃描儀。 ---- 利用第一種方法能減少編程的復(fù)雜度,但是系統(tǒng)的集成度不高,用戶(hù)使用上也不方便;第二種方法能在驅(qū)動(dòng)程序級(jí)直接控制掃描儀,能 在編程上提供最大的靈活性和可控性;第三種方法能充分利用Delphi的可視化構(gòu)件技術(shù),安全、靈活、自由地利用掃描儀。其實(shí)第三種方法也 是建立在掃描儀接口Twain.DLL之上的。本文論述的方法就采用第三種。
---- Windows9X在其附件中提供了“映象”可選件,該附件是采用OCX構(gòu)件來(lái)控制掃描儀的,共有imgEdit、imgAnntool、imgScan、imgAdmin 四個(gè),有這四個(gè)構(gòu)件基本上就能完全控制掃描儀。在Delphi中的用法如下: 在Windows9x中選擇安裝“映象”。(在控制面板中選擇“添加/刪除程序”,再選擇“安裝Windows”,點(diǎn)擊“附件”復(fù)選框,然后從“詳細(xì)資料”按鈕中可以找到“映象”)
啟動(dòng)Delphi,選擇“Component”菜單項(xiàng)下的“Import ActiveX Control”, 這時(shí)可以看到列表中有“Wang 圖象編輯控制、Wang 圖象掃描控制、Wang 圖象管理控制、Wang 圖象縮略圖控制”,選中這四項(xiàng),然后點(diǎn)擊“Install” 按鈕,這時(shí)在構(gòu)件面板上的ActiveX舌標(biāo)下就可以看到這四個(gè)構(gòu)件的圖標(biāo)。 ---- ImgScan 的主要屬性:FileType:圖象的文件類(lèi)型(該構(gòu)件支持三 種:TIFF,BMP,AWD);
ScanTo:返回或設(shè)置被掃描圖象的目的; 可取值 含義 0 (缺省) 顯示被掃描的圖象. 1 顯示被掃描的圖象并寫(xiě)入一個(gè)文件. 2 把圖象寫(xiě)入一個(gè)文件 3 以模板方式把圖象寫(xiě)入文件并顯示. 4 . 以模板方式把圖象寫(xiě)入文件 5 傳真被掃描的圖象 注意:如果取缺省值0, 必須和 Wang ImgEdit 構(gòu)件配合使用。 DestImageControl:Wang ImgEdit構(gòu)件名; Zoom:圖象的放縮比例
ImgScan 的主要方法:OpenScanner :打開(kāi)掃描儀; CloseScanner :關(guān)閉掃描儀; StartScan : 開(kāi)始掃描; StopScan : 停止掃描
---- ImgEdit 的屬性主要是控制掃描圖象的分辨率、圖象的寬高、是否 允許對(duì)圖象進(jìn)行局部選 擇等;其方法主要有拷貝、剪切圖象到粘貼板, 從粘貼板復(fù)制圖象,旋轉(zhuǎn)、放縮、 鏡象圖象;打印、保存、刷新圖象等。 ---- 關(guān)于上述四個(gè)OCX構(gòu)件的詳細(xì)使用說(shuō)明可在Delphi中查看其自帶的 幫助系統(tǒng)。 ---- 下面是使用這兩個(gè)構(gòu)件的一些例子:
procedure Tscanf.N1Click(Sender: TObject); begin ImgScan1.ShowSelectScanner; file://選擇系統(tǒng)中已安裝的掃描儀 end;
procedure Tscanf.N2Click(Sender: TObject); begin imgedit1.zoom:=100; file://設(shè)置圖象的放縮因子 if not imgscan1.ScannerAvailable then file://如果選擇的掃描儀不可用 imgscan1.OpenScanner;//打開(kāi)掃描儀 imgscan1.StartScan; file://開(kāi)始掃描圖象 imgscan1.CloseScanner; file://關(guān)閉掃描儀 end;
procedure Tscanf.N8Click(Sender: TObject); begin if (imgedit1.IsClipboardDataAvailable and imgedit1.ImageDisplayed ) then imgedit1.ClipboardPaste(selleft,seltop); file://從剪貼板粘貼圖象,其參數(shù)為Imgedit的顯示區(qū)域的起始坐標(biāo) end;
procedure Tscanf.N1801Click(Sender: TObject); begin if imgedit1.ImageDisplayed then imgedit1.Flip; file://鏡象圖象 end;
procedure Tscanf.N901Click(Sender: TObject); begin if imgedit1.ImageDisplayed then imgedit1.RotateRight file://向右旋轉(zhuǎn)圖象 end; procedure Tscanf.N6Click(Sender: TObject); begin imgedit1.DrawSelectionRect(selleft, seltop,selwidth,selheight);//進(jìn)行圖象局部選擇 imgedit1.ClipboardCut(selleft,seltop, selwidth,selheight);//剪切所選區(qū)域 end;
---- 注意:在DELPHI中使用Imgedit構(gòu)件的拷貝和剪切功能時(shí),會(huì)出現(xiàn) 以下問(wèn)題: ---- 1、 如果把整幅圖象都選中,沒(méi)有任何問(wèn)題; ---- 2、 如果選擇了局部區(qū)域,則拷貝和剪切的區(qū)域會(huì)發(fā)生漂移; ---- 3、 如果DELPHI做的是MS SQL后端數(shù)據(jù)庫(kù)的客戶(hù)端界面,那么在把 圖象內(nèi)容寫(xiě)入數(shù)據(jù)庫(kù)的圖象字段中時(shí),BDE(數(shù)據(jù)庫(kù)引擎)會(huì)報(bào)錯(cuò)。這是 DELPHI3。0和4。0的BUG,4。0的升級(jí)包可以解決這個(gè)問(wèn)題。 ---- 至于第二個(gè)問(wèn)題,可這樣解決:在Imgedit的onSelectionRectDrawn 事件中寫(xiě)一段代碼,把選擇區(qū)域的邊界值保存到四個(gè)全局變量中,在拷貝 和剪切之前用先前保存的變量再進(jìn)行一次選擇即可(當(dāng)然,這一切都在后 臺(tái)進(jìn)行的,見(jiàn)前面的例子)。 ---- 開(kāi)發(fā)環(huán)境: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.
|