通過Delphi完成圖象的縮放
發(fā)表時間:2023-07-27 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]給你一個圖像放大的文章:本文介紹實現(xiàn)圖象局部、平滑和無閃爍放大的算法原理,以及在Delphi中實現(xiàn)的技術(shù)。讀完本文,您一定會為Delphi能用如此少的代碼實現(xiàn)如此強大的功能驚嘆不已,這是許多其它開發(fā)...
給你一個圖像放大的文章:
本文介紹實現(xiàn)圖象局部、平滑和無閃爍放大的算法原理,以及在Delphi中實現(xiàn)的技術(shù)。讀完本文,您一定會為Delphi能用如此少的代碼實現(xiàn)如此強大的功能驚嘆不已,這是許多其它開發(fā)工具所無法比擬的。
算法原理
在Delphi中,可利用類Tcanvas的CopyRect方法實現(xiàn)圖象的放大和縮小。其功能是將源畫布上的一個指定矩形區(qū)域(簡稱源矩形)內(nèi)的象素,拷貝到目的畫布上的一個指定矩形區(qū)域(簡稱目的矩形)中。亦可稱之為象素塊復(fù)制,如圖1所示。
由CopyMode屬性確定拷貝的模式。在直接拷貝模式(cmSrcCopy)下,當(dāng)源矩形與目的矩形相等時,圖象不變;若源矩形大于目的矩形,圖象則縮。欢(dāng)源矩形小于目的矩形時,圖象便被放大(在目的矩形中擴(kuò)展)。源矩形與目的矩形大小之比,決定圖象的縮放倍數(shù)。CopyRect方法聲明如下:
Procedure CopyRect(const Dest: TRect; Canvas: TCanvas; const Source: Trect);
其中參數(shù),Dest為目的矩形,Canvas是源畫布,Source為源矩形。
實現(xiàn)步驟
新建應(yīng)用程序主目錄C:\Magnifier及其子目錄Images,將事先制作好的位圖圖象Picture.bmp存入Images目錄。本例中,Picture.bmp的大小為260*310象素。
啟動Delphi IDE,新建項目Magnifier.dpr,主窗體單元命名為Main.pas,存入C:\Magnifier目錄。在主窗體上放置一個TPanel組件,并在其中加入兩個TImage組件。兩個TImage組件分別命名為ForeImage和BackImage,前者重疊于后者之上,并且都裝入Picture.bmp位圖。
主窗體和各組件的主要屬性按表1設(shè)置:
表1 主窗體和各組件屬性設(shè)置
組 件 屬 性 設(shè) 置
Form1 BorderIcons.biMaximize False
BorderStyle bsNone
Color clRed
Height 364
KeyPreview True
Name MainForm
Position poScreenCenter
Width 294
WindowState wsNormal
Panel1 Align alNone
BevelInner bvLowered
BevelOuter bvRaised
BevelWidth 2
BorderStyle bsNone
BorderWidth 2
Height 322
Name FramePanel
Visible Ture
Width 272
Image1 Align alNone
AutoSize True
Center True
Height 310
Name BackImage
Picture Picture.bmp
Stretch False
Visible False
Width 260
Image2 Align alNone
AutoSize True
Center True
Height 310
Name ForeImage
Picture Picture.bmp
Stretch False
Visible True
Width 260
上述各組件的許多屬性,讀者亦可根據(jù)個人的愛好設(shè)定。在主單元Main.pas的implementation段聲明常量和變量:
const
sSide=30;
dSide=45;
var
msHide: Boolean;
OldX, OldY, NewX, NewY: Integer;
DestRect, SourceRect : TRect;
其中,常量sSide和dSide用以控制“放大鏡”的大小和放大倍數(shù);變量msHide控制光標(biāo)(鼠標(biāo))的隱藏和打開;其它變量用以確定放大部位。
建立主窗體MainForm的OnCreate事件,加入下列語句,以初始化變量及設(shè)置復(fù)制模式:
msHide:=True;
Canvas.CopyMode:=cmSrcCopy;