父绑定矩形的更有效副本

More efficient copy of parent bound rectangle

我想尽可能有效地复制 TRectangle 后面的位图区域(例如带有红色边框)。这是父控件中红色矩形的 boundsrect。

我的 Delphi Firemonkey 应用程序中有这个:

将整个父表面获取到临时父 TBitmap:

 (Parent as TControl).PaintTo(FParentBitmap.Canvas,
            RectF(0, 0, ParentWidth, ParentHeight));

然后复制我想要的矩形:

bmp.CopyFromBitmap(FParentBitmap, BoundsRect, 0, 0);

当然这样效率不高。我想一次性复制矩形,或者至少我不想将整个父对象绘制到临时 TBitmap 中。

你知道有效的方法吗?请告诉。

我创建了一个 TFrostGlass 组件,其中包含完整的源代码。你可以 see/download 在这里:https://github.com/Spelt/Frost-Glass

复制位图代码在:FrostGlass.pas

不幸的是,PaintTo 不允许只绘制控件的一部分。但是,正如@Rob Kennedy 提到的,您可以通过修改偏移量来控制内容在目标位图上的最终位置。

另外,在调用PaintTo之前调用BeginScene时,可以设置ClipRects参数,也就是说只有Canvas的这部分会被更新。如果您的目标位图大于 BoundsRect,这是必需的,因为否则您也会绘制它周围的区域。

procedure PaintPartToBitmap(Control: TControl; SourceRect, TargetRect: TRect; Bitmap: TBitmap);
  var ClipRects: TClipRects;
      X, Y: Single;
begin
  ClipRects := [TRectF.Create(TargetRect)];
  if (Bitmap.Canvas.BeginScene(@ClipRects)) then
    try
      X := TargetRect.Left - SourceRect.Left;
      Y := TargetRect.Top - SourceRect.Top;
      Control.PaintTo(Bitmap.Canvas, RectF(X, Y, X + Control.Width, Y + Control.Height));
    finally
      Bitmap.Canvas.EndScene;
    end;
end;