使用预定义的图像大小获取WPF窗口的屏幕截图,而不会降低质量

时间:2022-04-23 21:48:26

When I take a screenshot of a current WPF window, the image resolution is that of my monitor (if the app is maximized), which is ok. However, if I was to print that image to a much bigger format, the image would look blurry. I found the way to capture the current window, and save it as a png file, but it's not doing the trick. The image is saved with the resolution I set, but the actual wpf window takes only a small portion of the saved image. Example is taken from:

当我截取当前WPF窗口的屏幕截图时,图像分辨率是我的显示器的分辨率(如果应用程序最大化),这是可以的。但是,如果我要将图像打印成更大的格式,图像看起来会模糊不清。我找到了捕获当前窗口的方法,并将其保存为png文件,但它没有做到这一点。图像以我设置的分辨率保存,但实际的wpf窗口仅占用保存图像的一小部分。示例来自:

http://blogs.msdn.com/b/saveenr/archive/2008/09/18/wpf-xaml-saving-a-window-or-canvas-as-a-png-bitmap.aspx

        var screen = System.Windows.Application.Current.Windows.OfType<Window>().SingleOrDefault(x => x.IsActive);

        var rtb = new RenderTargetBitmap(4000, 4000, 96, 96, PixelFormats.Pbgra32);

        rtb.Render(screen);

        var enc = new System.Windows.Media.Imaging.PngBitmapEncoder();
        enc.Frames.Add(System.Windows.Media.Imaging.BitmapFrame.Create(rtb));

        using (var stm = System.IO.File.Create("ScreenShot.png"))
        {
            enc.Save(stm);
            using (Image img = Image.FromStream(stm))
            {
                Rectangle dest = new Rectangle(0, 0, 6000, 4000);

                using (Graphics imgG = Graphics.FromImage(img))
                {
                    imgG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                    imgG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                    imgG.DrawImage(img, dest);
                }

                img.Save("NewScreenShot.png");
            }
        }

So basically, I'd like to capture the screenshot with the resolution of 4000 x 4000, if that's possible, without losing quality. The above code produces an image of 4000 x 4000, however the screenshot only takes a small portion of it, its original resolution.

所以基本上,我想捕获分辨率为4000 x 4000的屏幕截图,如果可能的话,不会丢失质量。上面的代码生成了4000 x 4000的图像,但屏幕截图只占其原始分辨率的一小部分。

1 个解决方案

#1


6  

To scale your image, you can use a DrawingVisual and a ScaleTransform :

要缩放图像,可以使用DrawingVisual和ScaleTransform:

var w = 4000;
var h = 4000;

var screen = System.Windows.Application.Current.Windows.OfType<Window>().SingleOrDefault(x => x.IsActive);

var visual = new DrawingVisual();
using (var context = visual.RenderOpen())
{
    context.DrawRectangle(new VisualBrush(screen),
                          null,
                          new Rect(new Point(), new Size(screen.Width, screen.Height)));
}

 visual.Transform = new ScaleTransform(w / screen.ActualWidth, h / screen.ActualHeight);

 var rtb = new RenderTargetBitmap(w, h, 96, 96, PixelFormats.Pbgra32);
 rtb.Render(visual);

 var enc = new PngBitmapEncoder();
 enc.Frames.Add(BitmapFrame.Create(rtb));

 using (var stm = File.Create("ScreenShot.png"))
 {
     enc.Save(stm);
 }

#1


6  

To scale your image, you can use a DrawingVisual and a ScaleTransform :

要缩放图像,可以使用DrawingVisual和ScaleTransform:

var w = 4000;
var h = 4000;

var screen = System.Windows.Application.Current.Windows.OfType<Window>().SingleOrDefault(x => x.IsActive);

var visual = new DrawingVisual();
using (var context = visual.RenderOpen())
{
    context.DrawRectangle(new VisualBrush(screen),
                          null,
                          new Rect(new Point(), new Size(screen.Width, screen.Height)));
}

 visual.Transform = new ScaleTransform(w / screen.ActualWidth, h / screen.ActualHeight);

 var rtb = new RenderTargetBitmap(w, h, 96, 96, PixelFormats.Pbgra32);
 rtb.Render(visual);

 var enc = new PngBitmapEncoder();
 enc.Frames.Add(BitmapFrame.Create(rtb));

 using (var stm = File.Create("ScreenShot.png"))
 {
     enc.Save(stm);
 }