我想尽可能高效地复制TRectangle后面的位图区域(例如红色边框)。这是父控件中红色矩形的边界。
我在Delphi Firemonkey应用程序中有这个:
将整个父表面转换为临时父TBitmap:
(Parent as TControl).PaintTo(FParentBitmap.Canvas,
RectF(0, 0, ParentWidth, ParentHeight));
然后再复制我想要的矩形:
bmp.CopyFromBitmap(FParentBitmap, BoundsRect, 0, 0);
当然这不高效。我希望在1遍中复制矩形,或者至少我不想将整个父级绘制成临时TBitmap。
你知道一种有效的方法吗?请告诉。
我创建了一个TFrostGlass组件,其中包含完整的源代码。您可以在此处查看/下载它:https://github.com/Spelt/Frost-Glass
复制位图代码位于:FrostGlass.pas
答案 0 :(得分:0)
不幸的是,PaintTo
不允许仅绘制部分控件。但是,正如@Rob Kennedy所提到的,您可以通过修改偏移来控制目标位图上的内容最终结束。
此外,在调用BeginScene
之前调用PaintTo
时,您可以设置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;