【问题标题】:DCEF3: How to get a screenshotDCEF3:如何获取屏幕截图
【发布时间】:2014-05-20 08:57:31
【问题描述】:

如何在 DCEF3 中获取浏览器截图?

我在没有 VCL 的情况下创建这样的浏览器。 TakePicture 方法只有在

时才有效
  • 没有使用调试器
  • 如果使用 ShowWindow

    var
      info: TCefWindowInfo;
      Settings: TCefBrowserSettings;
    begin
      FillChar(info, SizeOf(info), 0);
      info.width := width;
      info.height := height;
      FillChar(Settings, SizeOf(TCefBrowserSettings), 0);
      Settings.Size := SizeOf(TCefBrowserSettings);
      GetSettings(Settings);
      CefBrowserHostCreateBrowser(@info, FHandler, FDefaultUrl, @settings, nil);
    end;
    
    procedure TakePicture(const Browser: ICefBrowser; Height, Width: Integer);
    var
      DC: HDC;
      Bmp : TBitmap;
      Handle : HWND;
      Rect : trect;
      BarHeight : integer;
      BarLeft : integer;
    begin
      Bmp := TBitmap.Create;
      Bmp.PixelFormat := pf32bit;
      Handle := Browser.Host.WindowHandle;
      ShowWindow(handle, SW_RESTORE); // will work only if this is used otherwise black image!
      BarLeft := GetSystemMetrics(SM_CXFRAME);
      BarHeight := GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME);
      GetWindowRect(Handle, Rect);
      DC := GetDC(Handle);
      Bmp.Width := Rect.Right - Rect.Left;
      Bmp.Height := (Rect.Bottom - Rect.Top);
      BitBlt(Bmp.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, DC, -BarLeft, -BarHeight, SRCCOPY);
      ReleaseDC(Handle, DC);
      Bmp.SaveToFile('c:\test.bmp');
      Bmp.Free;
    end;
    

【问题讨论】:

  • 请使用您正在使用的当前失败的实际快照代码更新您的问题。
  • @JanDoggen 没问题。 :)
  • 你不能只使用CefGetBitmap函数吗?
  • @TLama 我不认为 DCEF3 支持它。

标签: delphi delphi-xe5 chromium-embedded tchromium


【解决方案1】:

这基本上是离屏渲染。在 DCEF3 的 demos 文件夹中,您会找到一个“屏幕外”项目。您要查找的代码在TChromiumOSROnPaint 事件中。它呈现为TBitmap32,但任何位图都可以工作。请注意,它已被优化为仅绘制所谓的“脏”区域(自上次绘制以来已更改的区域),但如果您正在制作屏幕截图,那不是您想要的。在我对存储库的签出中,有一行被注释掉,显示了只绘制所有内容的幼稚案例:

SomeBitmap.SetSize(width, height);
Move(buffer^, SomeBitmap32.Bits^, width * height * 4);

我的最佳猜测是幻数4 代表 4 个字节(32 位)。

我强烈建议您使用 Graphics32,但您必须使用常规的 TBitmap,我将由您来决定如何将位数组转换为像素。加热它可能会慢很多。

【讨论】:

  • 这个答案没有多大帮助。需要具体的例子。
  • @user3655788 我的回答基本上告诉你在哪里可以找到示例。
  • 我得到一个黑色图像。我怀疑我需要使用屏幕外渲染来获得简单的屏幕截图。那是给火猴的。
  • @user3655788 试试那个演示;有用。在TBitmap32TPaintBox32 呈现之前,实际上并没有涉及任何VCL。好好看看它并将其翻译成您自己的代码,但基本上可以归结为上述内容。 “简单截图”仍然涉及渲染网站。如果您还没有将它渲染到表单中(在这种情况下,您可以使用@JanDoggen 提供的链接),您需要在屏幕外渲染。
  • @user3655788 使用该演示您可能遇到的唯一问题是您需要将event.type_ 更改为event.kind(编译时出错)。
猜你喜欢
  • 2014-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多