LoginSignup
8
8

More than 5 years have passed since last update.

WPFでWebBrowser内のスクリーンショットを保存する

Posted at

WPFで特定要素、今回の場合WebBrowserの範囲のスクリーンショットを保存するために以下のようなコードを書きました。

<WebBrowser x:Name="browser"/>
var rtb = new RenderTargetBitmap(
    (int)browser.Width,
    (int)browser.Height,
    96,
    96,
    PixelFormats.Pbgra32
);
rtb.Render(browser);

string dir = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
using (FileStream fs = File.Open(filePath, FileMode.Create))
{
    var encoder = new PngBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(bmp));
    encoder.Save(fs);
}

このコードでは当然何もキャプチャすることはできません。

RenderTargetBitmap クラスを読めばわかるように、ここでのbrowserはVisualオブジェクトでは全然ありません。つまりこれは以下のように書き直す必要があるということです。

Image imgScreen = new Image();
imgScreen.Width = (int)browser.Width;
imgScreen.Height = (int)browser.Height;
imgScreen.Source = new DrawingImage(VisualTreeHelper.GetDrawing(browser));

string fileName = "sample.png";
string directoryPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
string filePath = System.IO.Path.Combine(directoryPath, fileName);

using (FileStream fs = new FileStream(directoryPath, FileMode.Create))
{
    var vis = new DrawingVisual();
    DrawingContext cont = vis.RenderOpen();
    cont.DrawImage(
        imgScreen.Source,
        new Rect(new Size(imgScreen.Width, imgScreen.Height))
    );
    cont.Close();

    var rtb = new RenderTargetBitmap(
        (int)imgScreen.Width,
        (int)imgScreen.Height,
        96d,
        96d,
        PixelFormats.Default
    );
    rtb.Render(vis);

    var enc = new PngBitmapEncoder();
    enc.Frames.Add(BitmapFrame.Create(rtb));
    enc.Save(fs);
}
8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8