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