曾几何时,我描述了这个特定的需求。考虑到您的RenderGrid
签名,可能Bitmap
会在绘制位图后绘制参数的图像。然后通过绘制整个位图获得最佳性能Color1
,并且只绘制正方形Color2
:
procedure RenderGrid(Target: TBitmap; Height, Width: Integer; Size: Integer;
Color1, Color2: TColor);
var
Col: Integer;
Row: Integer;
begin
Target.SetSize(Width, Height)
Target.Canvas.Brush.Color := Color1;
Target.Canvas.FillRect(Rect(0, 0, Width, Height));
Target.Canvas.Brush.Color := Color2;
for Col := 0 to Width div Size do
for Row := 0 to Height div Size do
if Odd(Col + Row) then
Target.Canvas.FillRect(Bounds(Col * Size, Row * Size, Size, Size));
end;
更新
但是由于您在谈论大型位图,所以下面显示的例程甚至还要快 20%。它创建了一个只有 4 个方格的小位图,比如一个 2 x 2 的棋盘,并让目标的画笔属性自动将其展开。*)
procedure RenderGrid(Target: TBitmap; Height, Width: Integer; Size: Integer;
Color1, Color2: TColor);
var
Tmp: TBitmap;
begin
Tmp := TBitmap.Create;
try
Tmp.Canvas.Brush.Color := Color1;
Tmp.Width := 2 * Size;
Tmp.Height := 2 * Size;
Tmp.Canvas.Brush.Color := Color2;
Tmp.Canvas.FillRect(Rect(0, 0, Size, Size));
Tmp.Canvas.FillRect(Bounds(Size, Size, Size, Size));
Target.Canvas.Brush.Bitmap := Tmp;
if Target.Width * Target.Height = 0 then
Target.SetSize(Width, Height)
else
begin
Target.SetSize(Width, Height)
Target.Canvas.FillRect(Rect(0, 0, Width, Height));
end;
finally
Tmp.Free;
end;
end;
为了进一步优化这一点:缓存这个小位图 ( Tmp
),并在其大小未更改时重用它。
*)另请参阅:如何在不调用的情况下为位图着色FillRect()
?.