You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi 10.3/10.3.3 Firemonkey(Android)保存TPaintBox画布至Bitmap遇黑屏求助

解决Firemonkey Android中Bitmap绘制内容变黑的问题

看起来你遇到的核心问题是:在PaintBox的OnPaint事件中调用GameCanvasPaint能正常绘制,但直接使用TBitmap的Canvas调用同一函数时,最终生成的图片是黑色的。这在Firemonkey的Android平台上很常见,主要是因为TBitmap的Canvas需要手动管理绘制上下文,而PaintBox的OnPaint事件已经由系统自动处理了这一步。

下面是几个针对性的解决方案,按优先级排序:

方案1:直接使用PaintBox的截图功能(最简单)

Firemonkey控件自带MakeScreenshot方法,可以直接捕获控件的当前显示内容,无需重复调用绘制逻辑。这样能避免Canvas上下文的各种坑:

procedure TForm1.ShowShareSheetAction1BeforeExecute(Sender: TObject);
var
  ScreenShot: TBitmap;
begin
  ScreenShot := PaintBox1.MakeScreenshot;
  try
    ShowShareSheetAction1.Bitmap.Assign(ScreenShot);
  finally
    ScreenShot.Free;
  end;
end;

这个方法在Android平台上稳定性很高,因为它直接获取控件的渲染结果,不需要你手动处理Canvas的状态。

方案2:手动管理Bitmap Canvas的绘制上下文

如果你必须复用GameCanvasPaint绘制逻辑,那一定要记得在绘制前后调用BeginScene和EndScene——这是Firemonkey Canvas绘制的关键步骤,PaintBox的OnPaint事件已经自动帮你做了,但自定义Bitmap的Canvas需要手动执行:

procedure TForm1.ShowShareSheetAction1BeforeExecute(Sender: TObject);
begin
  // 确保Bitmap尺寸与PaintBox一致(用控件尺寸而非Canvas尺寸更准确)
  g_bmp_share.SetSize(PaintBox1.Width, PaintBox1.Height);
  
  g_bmp_share.Canvas.BeginScene;
  try
    g_bmp_share.Canvas.Clear($FFFFFF);
    GameCanvasPaint(g_bmp_share.Canvas);
  finally
    g_bmp_share.Canvas.EndScene; // 必须调用,否则绘制内容不会提交到Bitmap
  end;

  ShowShareSheetAction1.Bitmap.Assign(g_bmp_share);
end;

另外需要注意:

  • 避免使用Paintbox1.Canvas.Width/Height,直接用PaintBox1.Width/Height更可靠,因为Canvas的尺寸可能受DPI缩放影响。
  • 可以尝试设置Bitmap的像素格式为Android兼容的类型,比如g_bmp_share.PixelFormat := PF_R8G8B8A8;,部分设备对像素格式有要求。

方案3:排查绘制坐标与缩放问题

如果上面两种方法都无效,可能是GameCanvasPaint中的绘制逻辑依赖了PaintBox的上下文缩放。比如Firemonkey在高DPI设备上会自动缩放Canvas,而自定义Bitmap的Canvas默认没有这个缩放。你可以检查GameCanvasPaint中是否使用了Canvas.Scale或基于控件ClientRect的坐标,这时候需要确保Bitmap的Canvas也应用了相同的缩放比例:

// 在BeginScene后添加缩放(示例,根据你的实际情况调整)
g_bmp_share.Canvas.Scale(PaintBox1.Canvas.Scale.X, PaintBox1.Canvas.Scale.Y);

调试小技巧

可以先将Bitmap保存到本地文件,确认是绘制问题还是分享组件的问题:

g_bmp_share.SaveToFile(TPath.GetDocumentsPath + '/debug_screenshot.png');

然后通过文件管理器查看这个图片,如果图片正常,说明问题出在ShowShareSheetAction的配置上;如果还是黑色,那就是绘制逻辑的问题。

内容的提问来源于stack exchange,提问作者Sergey Zubkov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 20:33:14