Delphi GDI對象之繪制位圖


繪制位圖(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位圖,並在窗口的最上角顯示。

image

若顯示位圖不需修改時,可使用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像素大小,效果如下:

image

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;

這段代碼裝載位圖,將它分割成片段,然后在窗體任意位置顯示這些片段。下圖就是這段代碼的顯示結果。

image

拷貝位圖片段咋一看似乎沒有多大意義,然而普通的圖形程序設計方法就是創建由一些小的圖像構成的大圖,並只是將用戶需要的圖形拷貝到屏幕上。在這種情況下,CopyRect方法就可以使用。

Note

上面的代碼中利用SelectPalette函數設置窗體調色板為位圖的調色板屬性。由於某些奇特的原因,TCanvas類沒有調色板屬性,因此必須采用API設置窗體調色板。如果沒有設置調色板,那么當位圖片段顯示在窗體上時顏色時錯亂的,CopyRect方法是用不同原理在畫布上顯示位圖,因此當使用這種方法時,采用這種特別的步驟是很必要的。

在Windows2000下256色顯示設置下,使用與不使用SelectPalette函數的效果對比圖:

image

 

還有一種位圖繪制方法需要提及,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的透明背景位圖效果明顯。如下圖:

image


以上代碼均在Delphi7中測試通過,示例代碼下載: GDI之繪制位圖.rar


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM