繪制位圖(Drawing Bitmaps)
繪制位圖聽起來似乎很難,然而如幾次所見到的那樣,繪制位圖非常容易。TCanvas類具有幾種方法繪制位圖,最常用的方法是Draw方法,這種方法只是在畫布上指定位置繪制位圖。用戶已經見過幾個這樣的例子。下面是簡短的例子。
procedure TForm1.btn1Click(Sender: TObject); var Bitmap: TBitmap; begin Bitmap := TBitmap.Create; Bitmap.LoadFromFile('type.bmp'); Canvas.Draw(0, 0, Bitmap); Bitmap.Free; end;
這段代碼創建了一個TBitmap對象,裝載一副BMP位圖,並在窗口的最上角顯示。
若顯示位圖不需修改時,可使用Draw方法。
StretchDraw方法用於改變位圖的大小。用戶在所需繪制的位圖和圖像位置確定確定一個矩形框。如果所用矩形框大於位圖的原始大小,則放大位圖;如果矩形框小於位圖的原始大小,則縮小位圖,這里是一個例子:
procedure TForm1.btn2Click(Sender: TObject); var Bitmap: TBitmap; R: TRect; begin Bitmap := TBitmap.Create; Bitmap.LoadFromFile('type.bmp'); R := Rect(0, 0, 150, 150); { 將原始300x300的位圖縮放為150x150} Canvas.StretchDraw(R, Bitmap); Bitmap.Free; end;
以上代碼將位圖縮放為150x150像素大小,效果如下:
Note
StretchDraw沒法保持位圖的原始長寬比率。這完全由用戶確認位圖保持它的原始長寬比率。
另一個位圖繪制方法是CopyRect。這種方法要求同時指定源矩形框和目標矩形框。這就可以將位圖分成片段顯示,下面的例子就是:
procedure TForm1.btn3Click(Sender: TObject); var Bitmap: TBitmap; Src: TRect; Dst: TRect; I, X, Y: Integer; Strips: Integer; Stripsize: Integer; OldPal: HPALETTE; begin ClearCanvas; Bitmap := TBitmap.Create; Bitmap.LoadFromFile('type.bmp'); Strips := 6; { 分成六份} Stripsize := Bitmap.Height div Strips; OldPal := SelectPalette(Canvas.Handle, Bitmap.Palette, True); for I := 0 to Pred(Strips) do begin Src := Rect(0, i * Stripsize, Bitmap.Width, (i * Stripsize) + Stripsize); X := Random(Width - Bitmap.Width); Y := Random(Height - Stripsize); Dst := Rect(X, Y, X + Bitmap.Width, Y + Stripsize); Canvas.CopyRect(Dst, Bitmap.Canvas, Src); end; SelectPalette(Canvas.Handle, OldPal, True); Bitmap.Free; end;
這段代碼裝載位圖,將它分割成片段,然后在窗體任意位置顯示這些片段。下圖就是這段代碼的顯示結果。
拷貝位圖片段咋一看似乎沒有多大意義,然而普通的圖形程序設計方法就是創建由一些小的圖像構成的大圖,並只是將用戶需要的圖形拷貝到屏幕上。在這種情況下,CopyRect方法就可以使用。
Note
上面的代碼中利用SelectPalette函數設置窗體調色板為位圖的調色板屬性。由於某些奇特的原因,TCanvas類沒有調色板屬性,因此必須采用API設置窗體調色板。如果沒有設置調色板,那么當位圖片段顯示在窗體上時顏色時錯亂的,CopyRect方法是用不同原理在畫布上顯示位圖,因此當使用這種方法時,采用這種特別的步驟是很必要的。
在Windows2000下256色顯示設置下,使用與不使用SelectPalette函數的效果對比圖:
還有一種位圖繪制方法需要提及,BrushCopy方法要求用戶指定源矩形框、目標矩形框、圖像和透明色,BrushCopy聯機幫助中指出,使用ImageList組件而不要用這種方法,但是有時BrushCopy使用的很好,而且使用起來比ImageList組件要容易。使用具有透明背景的位圖時記得使用BrushCopy方法。
Delphi syntax:
procedure BrushCopy(const Dest: TRect; Bitmap: TBitmap; const Source: TRect; Color: TColor);
下面的例子,展示了CopyRect和BrushCopy顯示同一位圖的效果,代碼如下:
procedure TForm1.btn4Click(Sender: TObject); var Bitmap: TBitmap; MyRect, MyOther: TRect; begin MyRect := Rect(10, 10, 310, 165); MyOther := Rect(10, 170, 310, 320); Bitmap := TBitmap.Create; Bitmap.LoadFromFile('pchmonster.bmp'); Canvas.BrushCopy(MyRect, Bitmap, Rect(0, 0, 300, 150), clwhite); Canvas.CopyRect(MyOther, Bitmap.Canvas, Rect(0, 0, 300, 150)); Bitmap.Free; end;
運行后,BrushCopy的透明背景位圖效果明顯。如下圖:
以上代碼均在Delphi7中測試通過,示例代碼下載: GDI之繪制位圖.rar