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

Delphi 12.3 FMX Linux下获取TWebBrowser内容为位图的解决方案求助

Delphi 12.3 FMX Linux下获取TWebBrowser内容为位图的解决方案求助

我最近在Delphi 12.3 + FMX Linux 1.78(目标Ubuntu平台)上卡了个棘手的问题,想把TWebBrowser的内容导出成位图,试了各种官方方法都没用,甚至ChatGPT和Gemini也没能给出能正常运行的示例,只能来这儿求助各位大佬了!

先说说我的场景和遇到的坑:

  • 首先,FMX Linux下的TWebBrowser、TMediaPlayer这类控件好像是脱离FMX自身渲染体系的,导致没法在它们上面叠加TMultiView侧边栏、TListBox弹出菜单这类控件。我本来想了个折中方案:在需要叠加控件的时候,先把WebBrowser的内容转成位图当背景,这个在Windows上跑起来没问题,但到了Linux上直接歇菜。
  • 官方提供的TWebBrowser.MakeScreenshot在Linux上完全没反应,CaptureBitmap直接返回nil——我翻了FMX.WebBrowser.Linux的源码,发现这个方法根本就没实现!
  • 我试着想直接操作GTK的底层对象来截图,但第一步就卡壳了:完全拿不到TWebBrowser对应的内部GTK对象的句柄或指针,根本不知道从哪入手。

我的测试窗体很简单:TfrmMain里只放了TWebBrowser、TImage(用来显示WebBrowser的位图副本)、两个测试按钮,还有一个TEdit用来显示结果提示。以下是我的测试代码:

// TfrmMain contains just a TWebBrowser and a TImage
// 2 Buttons and a TEdit for result messages
procedure TfrmMain.cmdMethodCaptureBitmapClick(Sender: TObject);
begin
  var MyImage:=WebBrowser1.CaptureBitmap;
  if not Assigned(MyImage) then
  begin
    // on Linux, we get here
    txtMessage.Text:='CaptureBitmap returned nil';
    Exit;
  end;
  var sFmt:='CaptureBitmap returned %d x %d bitmap';
  txtMessage.Text:=Format(sFmt,[MyImage.Size.cx,MyImage.Size.cy]);
  imgCopyOfBrowser.Bitmap:=MyImage;
  MyImage.Free;
end;

procedure TfrmMain.cmdMethodMakeScreenshotClick(Sender: TObject);
begin
  var MyImage:=WebBrowser1.MakeScreenshot;
  if not Assigned(MyImage) then
  begin
    txtMessage.Text:='MakeScreenshot returned nil';
    Exit;
  end;
  var sFmt:='MakeScreenshot returned %d x %d bitmap';
  txtMessage.Text:=Format(sFmt,[MyImage.Size.cx,MyImage.Size.cy]);
  imgCopyOfBrowser.Bitmap:=MyImage;
  MyImage.Free;
  // on Linux, we get here, but imgCopyOfBrowser is empty / white
end;

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  var slHTML:=TStringList.Create;
  try
    slHTML.Add('<h2>Embedded Browser Demo</h2><p>This is HTML text rendered within a <strong>TWebBrowser</strong> FMX control.</p>');
    WebBrowser1.LoadFromStrings(slHTML.Text,TEncoding.ANSI,'about:blank');
  finally
    slHTML.Free;
  end;
end;

在Linux上运行时:

  • 点击调用CaptureBitmap的按钮,直接返回nil,提示框显示CaptureBitmap returned nil
  • 点击调用MakeScreenshot的按钮,虽然能拿到一个位图对象,但显示在TImage里是全白的空图

所以想请教各位:

  1. 有没有人有能正常运行的示例代码,能在FMX Linux上把TWebBrowser的内容正确转成位图?
  2. 或者有没有关于FMX Linux底层GTK操作的文档资源可以参考?

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 09:29:30