TDirectDrawSurface 提供了六種載入圖片的方法,涵蓋檔案、串流、VCL 圖形物件、DIB 等多種來源。理解各方法適用場景與效能差異,能靈活處理遊戲資源載入需求。
| 方法 | 來源類型 | 適用場景 | 需額外單元 |
|---|---|---|---|
LoadFromFile | 圖片檔案 | 最常用,支援 BMP/JPG/GIF 等 | 無 |
LoadFromStream | 記憶體串流 | 資源檔解壓、網路下載、加密存儲 | 無 |
LoadFromGraphic | TGraphic 物件 | 整合 VCL 圖形類 (TBitmap/TIcon/TPngImage) | 無 |
LoadFromGraphicRect | TGraphic + 區域 | 從大圖裁剪載入 (圖集/精靈表) | 無 |
LoadFromDIB | TDIB 物件 | 進階像素操作、自訂調色盤、非標準格式 | DIB |
LoadFromDIBRect | TDIB + 區域 + 縮放 | DIB 裁剪並縮放到指定尺寸 | DIB |
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DXDraws, StdCtrls, DIB; // 最後兩個方法需引用 DIB 單元
type
TForm1 = class(TForm)
DXDraw1: TDXDraw;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
const
ImgPath1 = 'C:\Temp\DelphiX.bmp';
procedure TForm1.Button1Click(Sender: TObject);
var
MySurface: TDirectDrawSurface;
begin
MySurface := TDirectDrawSurface.Create(DXDraw1.DDraw);
try
MySurface.LoadFromFile(ImgPath1); // 1. 直接載入檔案
DXDraw1.Surface.Fill($EEEEEE); // 淺灰背景區分
DXDraw1.Surface.Draw(0, 0, MySurface);
DXDraw1.Flip;
finally
FreeAndNil(MySurface);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
MySurface: TDirectDrawSurface;
stream: TMemoryStream;
begin
MySurface := TDirectDrawSurface.Create(DXDraw1.DDraw);
stream := TMemoryStream.Create;
try
stream.LoadFromFile(ImgPath1);
MySurface.LoadFromStream(stream); // 2. 從記憶體串流載入
DXDraw1.Surface.Fill($CCCCCC);
DXDraw1.Surface.Draw(0, 0, MySurface);
DXDraw1.Flip;
finally
FreeAndNil(stream);
FreeAndNil(MySurface);
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
MySurface: TDirectDrawSurface;
bit: TGraphic;
begin
MySurface := TDirectDrawSurface.Create(DXDraw1.DDraw);
bit := TBitmap.Create;
try
bit.LoadFromFile(ImgPath1);
MySurface.LoadFromGraphic(bit); // 3. 從 VCL 圖形物件載入
DXDraw1.Surface.Fill($999999);
DXDraw1.Surface.Draw(0, 0, MySurface);
DXDraw1.Flip;
finally
FreeAndNil(bit);
FreeAndNil(MySurface);
end;
end;
procedure TForm1.Button4Click(Sender: TObject);
var
MySurface: TDirectDrawSurface;
bit: TBitmap;
begin
MySurface := TDirectDrawSurface.Create(DXDraw1.DDraw);
bit := TBitmap.Create;
try
bit.LoadFromFile(ImgPath1);
{ 4. 從圖形物件指定區域載入 (來源矩形, 目標尺寸)
這裡取右下 1/4 區域,繪製到全尺寸表面 }
MySurface.LoadFromGraphicRect(bit,
bit.Width div 2, bit.Height div 2, // 來源左上角
Rect(0, 0, bit.Width, bit.Height)); // 目標矩形 (這裡似有參數誤解,實際為來源矩形)
DXDraw1.Surface.Fill($666666);
DXDraw1.Surface.Draw(0, 0, MySurface);
DXDraw1.Flip;
finally
FreeAndNil(bit);
FreeAndNil(MySurface);
end;
end;
procedure TForm1.Button5Click(Sender: TObject);
var
MySurface: TDirectDrawSurface;
dib: TDIB;
begin
MySurface := TDirectDrawSurface.Create(DXDraw1.DDraw);
dib := TDIB.Create;
try
dib.LoadFromFile(ImgPath1);
MySurface.LoadFromDIB(dib); // 5. 從 TDIB 載入
DXDraw1.Surface.Fill($333333);
DXDraw1.Surface.Draw(0, 0, MySurface);
DXDraw1.Flip;
finally
FreeAndNil(dib);
FreeAndNil(MySurface);
end;
end;
procedure TForm1.Button6Click(Sender: TObject);
var
MySurface: TDirectDrawSurface;
dib: TDIB;
begin
MySurface := TDirectDrawSurface.Create(DXDraw1.DDraw);
dib := TDIB.Create;
try
dib.LoadFromFile(ImgPath1);
{ 6. 從 TDIB 載入並縮放至表面尺寸 }
MySurface.LoadFromDIBRect(dib,
DXDraw1.Width, DXDraw1.Height, // 目標寬高
Rect(0, 0, dib.Width, dib.Height)); // 來源矩形
DXDraw1.Surface.Fill(0);
DXDraw1.Surface.Draw(0, 0, MySurface);
DXDraw1.Flip;
finally
FreeAndNil(dib);
FreeAndNil(MySurface);
end;
end;
end.

LoadFromFile,簡單直接。LoadFromStream。TPngImage、TJPEGImage 等 VCL 類時用 LoadFromGraphic。LoadFromGraphicRect 可從大圖裁剪單幀,但注意參數定義 (來源矩形 vs 目標矩形)。TDIB 相關方法。LoadFromDIBRect 可同時裁剪與縮放,適合生成不同解析度的 Mipmap 或縮圖。LoadFromFile 依賴 VCL 註冊的圖形類,需在專案 uses 中加入 Jpeg, PngImage 等單元。pf32bit)。DIB.pas 通常隨 DelphiX 範例提供,或可從網路取得開源實作。熟練掌握這六種載入方式,能讓遊戲資源管理系統更靈活應對各種美術資源管線需求。