Delphi 12 FMX组件截图全黑?如何正确捕获组件内容
Delphi 12 FMX 捕获TLayout组件内容截图全黑的解决办法
在Delphi 12 FMX中,执行以下代码后生成的BMP文件是TLayout形状的全黑图片,无法正确捕获包含TSpeedButton(内含TImage)的TLayout组件内容:
try Bmp := MyFMXLayout.MakeScreenshot; try Bmp.SaveToFile('C:\temp\mygraphic.bmp'); finally Bmp.Free; end; except on E:Exception do ShowMessage(E.Message); end;
最小复现步骤:
- 将TLayout命名为MyFMXLayout
- 在布局上放置一个TSpeedButton
- 在按钮上放置TImage并设置显示图形
解决方法
1. 强制组件完成渲染再截图
调用MakeScreenshot前,先触发组件重绘并等待消息处理,确保所有子组件渲染完成:
try MyFMXLayout.Repaint; Application.ProcessMessages; Bmp := MyFMXLayout.MakeScreenshot; try Bmp.SaveToFile('C:\temp\mygraphic.bmp'); finally Bmp.Free; end; except on E:Exception do ShowMessage(E.Message); end;
2. 截取Form后裁剪Layout区域
如果TLayout在可见的Form上,先截取整个Form截图,再裁剪出Layout对应的区域:
var FormBmp: TBitmap; LayoutRect: TRectF; begin try FormBmp := Self.MakeScreenshot; try LayoutRect := MyFMXLayout.AbsoluteRect; FormBmp.CopyFromBitmap(FormBmp.RectToBitmap(LayoutRect), 0, 0); FormBmp.SaveToFile('C:\temp\mygraphic.bmp'); finally FormBmp.Free; end; except on E: Exception do ShowMessage(E.Message); end; end;
3. 手动绘制组件到Bitmap
通过PaintTo方法直接将Layout及其子组件绘制到目标Bitmap画布:
var Bmp: TBitmap; begin try Bmp := TBitmap.Create(Trunc(MyFMXLayout.Width), Trunc(MyFMXLayout.Height)); Bmp.PixelFormat := TPixelFormat.BGRA8; try Bmp.Canvas.BeginScene; try MyFMXLayout.PaintTo(Bmp.Canvas, TRectF.Create(0, 0, Bmp.Width, Bmp.Height)); finally Bmp.Canvas.EndScene; end; Bmp.SaveToFile('C:\temp\mygraphic.bmp'); finally Bmp.Free; end; except on E: Exception do ShowMessage(E.Message); end; end;
注意事项
- 确保TLayout的
Visible属性为True,且未处于隐藏容器(如未激活的Tab页)中 - 若Layout在滚动容器内,需确保目标区域处于可视范围
- 包含透明元素时,设置Bitmap的
PixelFormat为BGRA8以保留透明度
内容的提问来源于stack exchange,提问作者Mike at Bookup
相关产品推荐
相关产品推荐

