Delphi 之Copyrect的使用
http://cqujsjcyj.iteye.com/blog/380970
?
Copyrect的使用(圖片復(fù)制、放大、以及做圖片放大鏡等)
一、從一個(gè)選取一個(gè)區(qū)域中的圖象到另一個(gè)圖象組件中的固定區(qū)域
procedure TForm1.Button1Click(Sender: TObject);
var
? rtDest, rtSource: TRect;
? rtIndex: Integer;
begin
? rtDest := Rect(0, 0, 200, 200); //在圖象二中選取的區(qū)域,定義的坐標(biāo)是相對(duì)于Image2的
? rtSource := Rect(0, 0, 50 , 41);//在圖象一中選取的區(qū)域,定義的坐標(biāo)是相對(duì)于Image1的
? Image2.Canvas.CopyRect(rtDest,.Canvas,rtSource);
?end;
注意:
1、?區(qū)域(Rect)坐標(biāo)的定義,是相對(duì)于它的父控件。
2、?可以起到圖象放大作用。如果圖象一的選取區(qū)域小于圖象二中的選取區(qū)域,那么圖一選取區(qū)域中的圖象,拉伸填充到圖象二中的選取區(qū)域。(圖象區(qū)域相同的復(fù)制不會(huì)造成圖象失真,如果變大或者變小,就容易造成失真)
3、?相片的拷貝只限于BMP圖片
二、如果要拷貝非bmp圖片可以用以下方法
procedure TForm1.Button3Click(Sender: TObject);
var
????? Bitmap:?? TBitmap;
????? MyRect,?? MyOther:?? TRect;
? begin
????? MyRect?? :=?? Rect(0,0,900,900);
????? MyOther?? :=?? Rect(0,0,300,300);
????? Bitmap?? :=?? TBitmap.Create;
????? bitmap.Assign(Image1.picture.Graphic);//轉(zhuǎn)換文件格式成bmp后保存到bitmap中,這樣就能用CopyRect了
????? Image2.Canvas.BrushCopy(MyOther,?? bitmap,?? MyRect,?? clBlack);? //這行與下行的意思基本相同,選擇其一即可
????? Image2.Canvas.CopyRect(MyOther,bitmap.Canvas,MyRect);
????? Bitmap.Free;
? end;
end.
三、如何將外部圖形保存在bitmap里面呢?
例子程序
var
? b: bmp;
begin
? b.b := TBitmap.Create;
? b.b.Assign(Image1.picture.Bitmap);
end;
【圖象列表】:
var
? ImageList: TList;
begin
? ImageList := TList.Create;
? ImageList.Add(Image1.Picture.Bitmap);
? Image2.Picture.Bitmap := TBitMap(ImageList.Items[0]);
end;
四、實(shí)現(xiàn)圖象局部放大的原理和方法
研究了好幾個(gè)小時(shí),試過了各種函數(shù),想做圖片分辨率的調(diào)整,不是效果與期望不符就是運(yùn)行出錯(cuò),差一點(diǎn)準(zhǔn)備發(fā)飚,自己寫一個(gè)抽樣縮小和插值放大的函數(shù),卻鬼使神差地看了下被我忽略這篇文章……我的媽呀,快搞瘋了,不過就是這么一句話而已!
·算法原理
?
在Delphi中,可利用類Tcanvas的CopyRect方法實(shí)現(xiàn)圖象的放大和縮小。其功能是將源畫布上的一個(gè)指定矩形區(qū)域(簡(jiǎn)稱源矩形)內(nèi)的象素,拷貝到目的畫布上的一個(gè)指定矩形區(qū)域(簡(jiǎn)稱目的矩形)中。亦可稱之為象素塊復(fù)制,如圖1所示。??
由CopyMode屬性確定拷貝的模式。在直接拷貝模式(cmSrcCopy)下,當(dāng)源矩形與目的矩形相等時(shí),圖象不變;若源矩形大于目的矩形,圖象則縮小;而當(dāng)源矩形小于目的矩形時(shí),圖象便被放大(在目的矩形中擴(kuò)展)。源矩形與目的矩形大小之比,決定圖象的縮放倍數(shù)。CopyRect方法聲明如下:??
Procedure CopyRect(const Dest: TRect; Canvas: TCanvas; const Source:?? Trect);??
其中參數(shù),Dest為目的矩形,Canvas是源畫布,Source為源矩形。
·實(shí)現(xiàn)步驟
?? ·新建應(yīng)用程序主目錄C:\Magnifier及其子目錄Images,將事先制作好的位圖圖象Picture.bmp存入Images目錄?糾校琍icture.bmp的大小為260*310象素。
? ·啟動(dòng)Delphi IDE,新建項(xiàng)目Magnifier.dpr,主窗體單元命名為Main.pas,存入C:\Magnifier目錄。在主窗體上放置一個(gè)TPanel組件,并在其中加入兩個(gè)TImage組件。兩個(gè)TImage組件分別命名為ForeImage和BackImage,前者重疊于后者之上,并且都裝入Picture.bmp位圖。
·在主單元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;
? ·創(chuàng)建主窗體MainForm的OnKeyPress事件處理程序,在其begin與end之間輸入語句"Close;",當(dāng)按任意鍵時(shí)結(jié)束程序運(yùn)行。
? ·定義過程ImageCopy,用于處理圖象的放大和恢復(fù),當(dāng)移動(dòng)鼠標(biāo)時(shí)調(diào)用。這是實(shí)現(xiàn)圖象局部放大最重要的過程,源代碼如下。
??
procedure TMainForm.ImageCopy(BoxCenterX,?? BoxCenterY, BoxSide: Integer);??
begin??
with SourceRect do??
begin??
Left:=BoxCenterX-BoxSide;??
Top:=BoxCenterY-BoxSide;??
Right:=BoxCenterX+BoxSide;??
Bottom:=BoxCenterY+BoxSide;??
end;??
with DestRect do??
begin??
Left:=BoxCenterX-dSide;??
Top:=BoxCenterY-dSide;??
Right:=BoxCenterX+dSide;??
Bottom:=BoxCenterY+dSide;??
end;??
ForeImage.Canvas.CopyRect(DestRect, BackImage.Canvas, SourceRect);??
end;??
注意,別忘了在Main.pas的"type"中聲明過程ImageCopy。
? ·創(chuàng)建ForeImage的OnMouseMove事件處理程序,當(dāng)鼠標(biāo)在圖象上移動(dòng)時(shí),獲取其位置,并作為過程調(diào)用的實(shí)參。此時(shí),光標(biāo)隱藏,"放大鏡"出現(xiàn)。隨著"放大鏡"的移動(dòng),圖象新的部位被放大,滑過的部位又恢復(fù)原狀。以下為begin與end之間的代碼:
??
NewX:=X;??
NewY:=Y;??
if msHide then??
begin??
OldX:=NewX;??
OldY:=NewY;??
msHide:=False;??
ShowCursor(False);???
end else??
begin??
ImageCopy(OldX, OldY, dSide);??
end;??
ImageCopy(NewX, NewY, sSide);??
OldX:=NewX;??
OldY:=NewY;?
·建立主窗體MainForm的OnMouseMove事件處理程序,當(dāng)鼠標(biāo)移開圖象時(shí),"放大鏡"隱藏,光標(biāo)重新出現(xiàn)。源代碼片段如下:
if not msHide then
begin
msHide:=True;
ShowCursor(True);
ImageCopy(OldX, OldY, dSide);?
end;
·技術(shù)剖析
以上介紹了利用了畫布的CopyRect方法,將圖象以象素塊從后臺(tái)隱藏的TImage組件畫布上向前臺(tái)TImage組件的畫布上拷貝,以實(shí)現(xiàn)圖象的放大與恢復(fù)的技術(shù)。由于這一技術(shù)的采用,在圖象放大前不需要存儲(chǔ)象素,此后直接從后臺(tái)TImage組件畫布上恢復(fù)圖象。不僅節(jié)省了內(nèi)存資源,也確保了對(duì)圖象的局部進(jìn)行平滑、無閃爍地放大。同時(shí),程序源代碼也簡(jiǎn)潔、明了。
五、一個(gè)放大鏡的原程序
procedure TMainForm.ImageCopy(BoxCenterX, BoxCenterY, BoxSide: Integer);
begin
with SourceRect do
begin
Left:=BoxCenterX-BoxSide;
Top:=BoxCenterY-BoxSide;
Right:=BoxCenterX+BoxSide;
Bottom:=BoxCenterY+BoxSide;
end;
with DestRect do
begin
Left:=BoxCenterX-dSide;
Top:=BoxCenterY-dSide;
Right:=BoxCenterX+dSide;
Bottom:=BoxCenterY+dSide;
end;
ForeImage.Canvas.CopyRect(DestRect, BackImage.Canvas, SourceRect);
end;
?
轉(zhuǎn)載于:https://www.cnblogs.com/tc310/p/5192737.html
總結(jié)
以上是生活随笔為你收集整理的Delphi 之Copyrect的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小程序需要多少钱啊?
- 下一篇: 20160203.CCPP体系详解(00