<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      在Delphi中控制掃描儀

      [摘要]---- 在利用Delphi開發信息管理系統時,常常要處理圖象,這也是信息管理系統發展的必然趨勢。怎樣在Delphi中通過掃描儀獲得所需的圖象信息呢?不外乎有三種基本的方法: 通過圖象處理軟件,比如...
      ---- 在利用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;
      file://選擇系統中已安裝的掃描儀
      end;

      procedure Tscanf.N2Click(Sender: TObject);
      begin
      imgedit1.zoom:=100; file://設置圖象的放縮因子
      if not imgscan1.ScannerAvailable then
      file://如果選擇的掃描儀不可用
      imgscan1.OpenScanner;//打開掃描儀
      imgscan1.StartScan; file://開始掃描圖象
      imgscan1.CloseScanner; file://關閉掃描儀
      end;


      procedure Tscanf.N8Click(Sender: TObject);
      begin
      if (imgedit1.IsClipboardDataAvailable
      and imgedit1.ImageDisplayed ) then
      imgedit1.ClipboardPaste(selleft,seltop);
      file://從剪貼板粘貼圖象,其參數為Imgedit的顯示區域的起始坐標
      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://向右旋轉圖象
      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.


      日韩精品一区二区三区高清