10.3 圖 像 處 理
Delphi提供一組圖形圖像組件和一組圖像類用於圖形及圖像處理。
常用的圖形圖像組件有Shape、PaintBox和Image組件,相關的圖像類有TGraphic、TPicture和TBitmap。
10.3.1 圖形圖像組件
1.PaintBox繪圖區域組件
Delphi除了允許在Form上直接繪制圖形外,還允許使用PaintBox組件來作圖。PaintBox 組件位於System選項卡中。
用PaintBox繪制圖形與在Form上繪制圖形的方法相似,不同的是在程序設計階段,可以直接設定PaintBox的大小和位置。
在使用Canvas屬性繪制圖形時,圖形的坐標都是相對於PaintBox組件的,即PaintBox的左上角為(0,0) 的坐標,而不用管PaintBox在Form上的位置,同時當圖形的大小超出PaintBox組件區域時,超出部分將自動被切割。
2.Shape顯示圖形組件
Shape組件用於顯示簡單的圖形,如矩形、橢圓等,位於Additional選項卡中。
Shape組件的Width、Height、Left和Top屬性決定圖形的大小和位置;
Brush和Pen屬性的意義與TCanvas中的完全相同;
Shape屬性決定所顯示圖形的形狀,取值為stEllipse(橢圓)、stCircle(圓形)、stRectangle(矩形)、stRoundRect(圓角矩形)、stSquare(正方形)或stRoundSquare(圓角正方形)。
3.Image繪圖及顯示圖像組件
Image組件除了可以繪圖外,還可用於顯示各種不同格式的圖像,位於Additional選項卡上。其主要屬性如下:
(1)Picture屬性。
Picture屬性保存Image組件所要顯示的圖像文件。使用該屬性編輯器中的Load按鈕,可裝入.bmp、.ico、.jpg、.jpeg、.emf、.wmf等圖像文件,不能裝入.gif圖像文件。
程序運行時,可使用Picture屬性的LoadFromFile和SaveToFile方法實現圖像文件的裝入與保存。例如:
Image1.Picture.LoadFromFile('c:\My Documents\fly.bmp'); //裝入文件
Image1.Picture.SaveToFile('d:\temp\fly.bmp'); //保存文件
(2)AutoSize屬性。
AutoSize屬性確定是否調整Image組件的尺寸與圖像的大小一致。當取值為True時,調整Image組件的尺寸與圖像的大小一致,以顯示完整的圖像。默認值為False。
(3)Stretch屬性。
Stretch屬性確定是否改變圖像尺寸以適應Image組件的大小。
當取值為True時,圖像尺寸與Image的大小一致。如果改變Image組件的大小,圖像大小也會隨之變化。默認值為False。該屬性對圖標(ICO)格式的圖像無效。
(4)Center屬性。
Center屬性控制圖像是否居中顯示。
當取值為True時,圖像在Image組件居中顯示。默認值為False。當AutoSize和Stretch的取值均為False時,該屬性設置有效。
(5)Transparent屬性。
Transparent屬性確定Image組件是否透明。
當取值為True時,Image組件透明,表示允許在Image組件下面的其他組件可見,否則不透明。該屬性只對bitmap位圖文件有效。
4.圖像對話框
Delphi的標准對話框組件OpenPictureDialog和SavePictureDialog是分別用於打開和保存圖像文件的兩個對話框。
這些對話框提供對圖像文件的預覽功能,提供圖像文件的過濾功能,默認的圖像文件格式為*.bmp、*.ico、*.emf、*.wmf、*.jpg等。
10.3.2 圖像類
用Canvas繪制出來的圖形只能是一些簡單圖形,程序中如果需要用到一些復雜的圖像,就必須從圖像文件中調用。Delphi的圖像類具有處理BMP、ICO、JPG等圖像文件的能力。
1.TGraphic類及其子類
Delphi能處理的圖像文件格式主要有4種:
Bitmap位圖文件、Icon圖標文件、Metafile圖元文件和JPEG圖像文件,對應的類分別為TBitmap、TIcon、TMetafile和TJPEGImage,它們都是TGraphic類的子類。
TGraphic類中處理圖像文件的屬性和方法如下所示。
· Empty只讀屬性:取值為True時,沒有圖像數據。
· Width和Height屬性:控制圖像的寬度和高度。
· LoadFromFile和SaveToFile方法:讀取和保存圖像文件。
TGraphic類中定義的LoadFromFile和SaveToFile方法是虛方法,讀取和保存文件的具體操作由其子類實現。
例如,TBitmap類的LoadFromFile和SaveToFile方法只能讀寫*.bmp文件,
TIcon類的LoadFromFile和SaveToFile方法只能讀寫*.ico文件等。這兩個方法都只有一個字符串類型的參數,指出文件的路徑,路徑中包含文件名,且文件名的後綴名必須與子類的類型相對應,否則將導致錯誤。
TBitmap的主要屬性和方法如下所示。
· Canvas屬性:返回一個TCanvas類實例,用於在位圖上繪制各種圖形。
· Create方法:創建一個TBitmap類實例。
· Assign方法:將一個圖像數據賦給當前TBitmap類對象。
2.TPicture類
使用TBitmap、TIcon和TMetafile類只能處理固定格式的圖像文件,而TPicture類可以處理多種類型的圖像文件。
TPicture類有一個Graphic屬性,類型為TGraphic,能容納TGraphic的所有子類對象。同時,TPicture中也有LoadFromFile和SaveToFile方法,它們與TGraphic中文件處理方法不同的是,根據圖像文件的後綴名,自動選擇合適的文件類型保存或讀取圖像文件。
3.讀取、顯示與保存圖像
使用TBitmap對象,可讀取圖像文件,將圖像文件顯示在窗體上,也可將窗體上的圖像文件保存成.bmp文件。例如:
var
bmp1: TBitmap;
bmp1:=TBitmap.Create; //創建TBitmap實例
bmp1.LoadFromFile('C:\WlNDOWS\Clouds.bmp'); //只能讀取BMP圖像
Form1.Canvas.Draw(0,0,bmp1); //圖像顯示在窗體上
bmp1.Free; //釋放圖像對象
在窗體或組件上顯示圖形可使用Canvas中的Draw和StretchDraw方法,定義如下:
procedure Draw(X,Y: double; Graphic: TGraphic);
procedure StretchDraw(const Rect: TRect; Graphic: TGraphic);
4.打印圖像TPrinter類
Delphi中使用TPrinter對象可以訪問打印機端口。
如果要使用TPrinter對象打印圖像,必須在程序的uses語句中添加Printers單元,這樣系統就會自動聲明一個TPrinter類的對象printer,之後通過printer可引用TPrinter類的屬性。
TPrinter的主要屬性見表10-5。
表10-5 TPrinter的主要屬性
屬 性
意 義
BeginDoc
開始打印
Canvas
在打印一頁之前,Canvas在內存中創建這個頁所在的位置
EndDoc
結束打印,在調用EndDoc之前並不進行實際的打印操作
NewPage
打印機換頁,並將Canvas的Pen屬性值回到起始位置(0,0)
PageHeight
返回頁的高度
PageNumber
返回正在被打印的頁號
TextOut
使文本被發送到Canvas
TPrinter的主要方法有GetPrinter( )和SetPrinter( ),這兩個方法用來獲取和設置打印機的一些信息。GetPrinter方法聲明如下:
procedure GetPrinter(ADevice,ADriver,APort:PChar;var ADeviceMode: THandle);
其中,參數分別表示設備的名稱、驅動文件名、端口號以及指向打印機的DevMode結構的句柄變量。
SetPrinter方法的聲明格式與GetPrinter的完全一致,只是功能正好相反。