線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:4354
推到 Plurk!
推到 Facebook!

掃瞄器驅動軟體程式碼

 
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-02-26 22:50:44 IP:61.219.xxx.xxx 未訂閱
在利用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討論區站長~~~
系統時間:2024-11-23 5:09:41
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!