1. 程式人生 > >Delphi 中圖象的放大和縮小

Delphi 中圖象的放大和縮小

在Delphi中,可利用類Tcanvas的CopyRect方法實現圖象的放大和縮小。其功能是將源畫布上的一個指定矩形區域(簡稱源矩形)內的象素,拷貝到目的畫布上的一個指定矩形區域(簡稱目的矩形)中。亦可稱之為象素塊複製。
  由CopyMode屬性確定拷貝的模式。在直接拷貝模式(cmSrcCopy)下,當源矩形與目的矩形相等時,圖象不變;若源矩形大於目的矩形,圖象則縮小;而當源矩形小於目的矩形時,圖象便被放大(在目的矩形中擴充套件)。源矩形與目的矩形大小之比,決定圖象的縮放倍數。CopyRect方法宣告如下:
  Procedure CopyRect(const Dest: TRect; Canvas: TCanvas; const Source: Trect);
  其中引數,Dest為目的矩形,Canvas是源畫布,Source為源矩形。
  實現步驟
  新建應用程式主目錄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設定:
  表1 主窗體和各元件屬性設定

組 件 
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


  在主單元Main.pas的implementation段宣告常量和變數:
  const
  sSide=30;
  dSide=45;
  var
  msHide: Boolean;
  OldX, OldY, NewX, NewY: Integer;
  DestRect, SourceRect : TRect;
  其中,常量sSide和dSide用以控制“放大鏡”的大小和放大倍數;變數msHide控制游標(滑鼠)的隱藏和開啟;其它變數用以確定放大部位。
  建立主窗體MainForm的OnCreate事件,加入下列語句,以初始化變數及設定複製模式:
  msHide:=True;
  Canvas.CopyMode:=cmSrcCopy;
  建立主窗體MainForm的OnKeyPress事件處理程式,在其begin與end之間輸入語句“Close;”,當按任意鍵時結束程式執行。
  定義過程ImageCopy,用於處理圖象的放大和恢復,當移動滑鼠時呼叫。這是實現圖象區域性放大最重要的過程,原始碼如下。
  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。
  建立ForeImage的OnMouseMove事件處理程式,當滑鼠在圖象上移動時,獲取其位置,並作為過程呼叫的實參。此時,游標隱藏,“放大鏡”出現。隨著“放大鏡”的移動,圖象新的部位被放大,滑過的部位又恢復原狀。以下為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事件處理程式,當滑鼠移開圖象時,“放大鏡”隱藏,游標重新出現。原始碼片段如下:
  if not msHide then
  begin
  msHide:=True;
  ShowCursor(True);
  ImageCopy(OldX, OldY, dSide);
  end;
  編譯執行
  至此,已不再需要做更多的事情,立即編譯執行吧。啊,美麗的照片出現在螢幕中央!試試放大效果。將滑鼠徐徐移入相框,奇蹟出現了,滑鼠變成了“放大鏡”,所到之處,圖象的相應部位被放大,十分平滑,毫無閃爍。這不是同您手持放大鏡,觀看地圖和照片的情景一樣嗎。好酷啊!還有什麼能比這更激動人心的呢?!
  技術剖析
  以上介紹了利用了畫布的CopyRect方法,將圖象以象素塊從後臺隱藏的TImage元件畫布上向前臺TImage元件的畫布上拷貝,以實現圖象的放大與恢復的技術。由於這一技術的採用,在圖象放大前不需要儲存象素,此後直接從後臺TImage元件畫布上恢復圖象。不僅節省了記憶體資源,也確保了對圖象的區域性進行平滑、無閃爍地放大。同時,程式原始碼也簡潔、明瞭。
  “放大鏡”的中心便是滑鼠的位置,這樣處理的好處是使得圖象在“放大鏡”中均勻展開,並確保圖象邊緣也能同樣放大。
  要改變“放大鏡”的大小和圖象的放大倍數,只需修改常量sSide和dSide的值。實際應用中,亦可靈活處置,如將它們設定成變數,由程式選單控制。本例“放大鏡”的大小為90*90個象素,放大倍數為1.5。值得一提的是,這裡的“放大鏡”比真正的玻璃放大鏡的效果要好得多。玻璃放大鏡是用凸透鏡製成的,中間與邊緣的放大倍數不一致,導致圖象發生形變。而且,當一邊移動一邊觀察時,很容易使人眼花繚亂。本文為您展示的“放大鏡”則沒有這些現象。
  利用TCanvas的StretchDraw方法或其它方法,也可以實現圖象的區域性放大。另外,雖然本文介紹的演算法已經相當令人滿意,但還是可以作進一步修改的。例如在“放大鏡”移動時,只放大和恢復必要的部分。有興趣的讀者不妨一試。

相關推薦

Delphi 放大縮小

在Delphi中,可利用類Tcanvas的CopyRect方法實現圖象的放大和縮小。其功能是將源畫布上的一個指定矩形區域(簡稱源矩形)內的象素,拷貝到目的畫布上的一個指定矩形區域(簡稱目的矩形)中。亦可稱之為象素塊複製。   由CopyMode屬性確定拷貝的模式。在直接拷

1.5 Illustrator視放大縮小

illustrator 本節課將為您演示,如何通過放大畫面的顯示比例,以清晰查看畫面的細節,和縮小畫面比例,以查看整體的畫面效果。依次點擊[視圖 > 放大]命令。 每執行一次[放大]命令,畫面就會按照一定的比例放大顯示。 依次點擊[視圖 > 縮小]命令。 每執行一次[縮小]命令,

C語言如何實現C++屬性方法

討論 button c語言 對象 ron oid 技術分享 數據 而在   在C++中,我們常見到用類定義一個對象,這個對象可以有他自己的屬性(數據)和方法(函數),而在C語言的正常語法中,是禁止在結構體中定義函數的。   在一個關於觸摸屏的驅動程序中發現,用C語言的也可以

pychram 通過滾輪放大縮小字型以及在頭部添加註釋

1.如何新增頭部註釋程式碼         進入設定         File->Settings->Editor->File and C

Android之監聽View的兩個指頭是放大縮小

我們有時需要對view進行手勢監聽,通過兩個手指開始距離和結束距離,來判斷放大縮小,下面是實現程式碼,所有View通用。 private double nLenStart = 0;//監聽 WebView所用手勢 @Override public boolean on

CSS3 實現DIV放大縮小

.zoom { transform: scale(1,1); -ms-transform: scale(1,1); /* IE 9 */ -webkit-transform: scale(0.8,0.8

lozi混沌對映吸引子,使用python的matplotlib繪製,可以放大縮小

廢話不多,需要安裝python,和matplotlib、numpy等庫,安裝不全的,自行安裝一下 在windows下測試通過 # -*- coding: utf-8 -*- #需要安裝matplotlib、numpy等庫才能執行 import numpy as np

關於delphiwrite,read,writelnreadln的用法

read為讀入,引數為read(a,b,c……);意為將變數a,b,c……讀入(注意:輸入的資料一定要與設定一致,否測會出錯誤)。 readln也是讀入,引數相同,但多一個功能,就是在a,b,c……讀入完畢以後,再讀入一個回車。例如,現有資料1 3 5 7,執行口令為re

SCI論文投稿、表公式的位置問題

相信很多向期刊投過論文的小夥伴都有類似的經歷,就是在大部分的sci期刊的”Guide for Authors”中要求的論文中關於,圖,表,和公式的位置放置問題。比如有些期刊要求將圖,表和公式都放在論文的最後。有些期刊又明確說可以放在手稿中。對於新手來說這些東東到

Layout的放大縮小效果例子(ScaleAnimation)

個Layout從中心放大和縮小的例子,直接上程式碼: 1.ScaleDialog.java檔案 Java程式碼  package cn.com;      import android.app.Activity;   import android.graphics.drawable.Drawable;   i

C# 實現點選按鈕進行頁面的放大縮小

using System.Windows.Forms; private System.Windows.Forms.WebBrowser webBrowser1; float times = 1.0F; private void button1_Click(object se

MFC儲存--關於相容DCCMetaFileDc的用法

CPtrArray類物件中,然後在OnDraw函式中取出相關資訊繪圖。2、使用相容DC:先將當前圖象貼到一個記憶體CBitmap物件塊中,然後再用相容DC將其SelectObject,OnDraw函式中在拷貝相容DC的內容到當前的繪圖DC中完成重繪操作。//儲存當前點陣圖的操作        m_dcCmp.

【短道速滑一】OpenCVcvResize函式使用雙線性插值縮小影象到長寬大小一半時速度飛快(比最近鄰還快)之異解析自我實現。

  今天,一個朋友想使用我的SSE優化Demo裡的雙線性插值演算法,他已經在專案裡使用了OpenCV,因此,我就建議他直接使用OpenCV,朋友的程式非常注意效率和實時性(因為是處理視訊),因此希望我能測試下我的速度和OpenCV相比到底那一個更有速度優勢,恰好前一段時間也有朋友有這方面的需求,因此我就隨意編

如何用delphiData Module 管理數據庫連接 Adoquery 及 datasourse 等

href src 數據庫連接 為什麽 com 根據 table log other 首先關於使用data module 的理論可以參看,裏面講的很詳細:https://wenku.baidu.com/view/073aa98aa0116c175f0e48e2.html 其次

JAVA創建初始化過程

2.3 人的 cin 類型變量 認識 handle product window blank 1.Java中的數據類型   Java中有3個數據類型:基本數據類型(在Java中,boolean、byte、short、int、long、char、float、double這八種

delphiWebBrowser的parent改變時變成空白問題的解決(覆蓋CreateWndDestroyWnd)

classes panel replace orm cat art topic alt 解決 這段時間在做一個delphi界面打開網頁的功能,且此網頁所在窗口可完整顯示,可縮小到另一個窗口的panel上顯示 可是在改變網頁所在窗口時,WebBrowser控件變成了空白

delphi的copy函數pos函數

結果 -1 位置 s函數 第一次 best 一個 字符 開始 1、copy(‘csdn’,1,2) 返回的結果是 cs 註釋: Copy有3個參數,第一個是要處理的字符串,第二個是要截取的開始位置,第三個是截取位數 當第三個參數大於字符長度,那麽效果就是

一張講解對關鍵字synchronized修飾方法

www. 堅持 測試 共享資源 成長 和我 核心技術 資源 rri 每個對象在出生的時候就有一把鑰匙(監視器),那麽被synchronized 修飾的方法相當於給方法加了一個鎖,這個方法就可以進行同步,在多線程的時候,不會出現線程安全問題。 下面通過一張圖片進行講解: 1.

一張講解對關鍵字synchronized修飾方法(代碼塊)

簡單 讓我 同步 所有 鑰匙 可能 轉換 java 有關   每個對象在出生的時候就有一把鑰匙(監視器Monitor),那麽被synchronized 修飾的方法相當於給方法加了一個鎖,這個方法就可以進行同步,在多線程的時候,不會出現線程安全問題。    註:Monitor

Python的引用共享引用

col 即使 列表 標簽 同一性 例子 垃圾回收 是否 垃圾 在Python中先創建一個對象,然後再將變量指向所創建的對象。 對於每個對象,都有一個頭部信息,在信息中就標記了這個對象的類型信息。每當一個變量名被賦予了一個新的對象,之前那個對象占用的空間就回被回收(如果此時這