1

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;
    
4

1 に答える 1

1

これは基本的にオフスクリーン レンダリングです。DCEF3 の demos フォルダーには、プロジェクト「オフスクリーン」があります。お探しのコードOnPaintTChromiumOSR. TBitmap32にレンダリングされますが、任意のビットマップを機能させることができます。いわゆる「汚れた」領域 (前回の描画以降に変更された領域) のみを描画するように最適化されていることに注意してください。リポジトリのチェックアウトでは、すべてをペイントするだけの単純なケースを示すコメントアウトされた行があります。

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

4マジック ナンバーは 4 バイト (32 ビット) を表していると思います。

Graphics32 を使用することを強くお勧めしますが、通常の TBitmap を使用する必要がある場合は、ビットの配列をピクセルに変換する方法を理解する必要があります。おそらくもっと遅くなるでしょう。

于 2014-05-20T10:44:52.913 に答える