Posted at

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

More than 3 years have passed since last update.

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);
}