如何在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;
答案 0 :(得分:1)
这基本上是离屏渲染。在DCEF3的demos文件夹中,您将找到一个“屏幕外”项目。您要查找的代码位于OnPaint
TChromiumOSR
事件中。它呈现为TBitmap32,但任何位图都可以生效。请注意,它已被优化为仅绘制所谓的“脏”区域(自上次绘制以来已更改的那些区域),但如果您正在制作屏幕截图,那么这不是您想要的。在我的存储库退房时,有一条线被注释掉,显示出只绘制一切的天真案例:
SomeBitmap.SetSize(width, height);
Move(buffer^, SomeBitmap32.Bits^, width * height * 4);
我最好的猜测,幻数4
代表4个字节(32位)。
我热烈推荐使用Graphics32,但你必须使用常规的TBitmap,我将由你来决定如何将位数组转换为像素。温暖它可能会慢得多。