父绑定矩形的更有效副本
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;
我的 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;