C# 使用预定义的图像大小拍摄WPF窗口的屏幕截图,但不会丢失质量

C# 使用预定义的图像大小拍摄WPF窗口的屏幕截图,但不会丢失质量,c#,.net,wpf,screenshot,C#,.net,Wpf,Screenshot,当我拍摄当前WPF窗口的屏幕截图时,图像分辨率是我显示器的分辨率(如果应用程序最大化),这是可以的。然而,如果我要将图像打印成更大的格式,图像看起来会很模糊。我找到了捕获当前窗口并将其保存为png文件的方法,但它并没有起到作用。图像以我设置的分辨率保存,但实际的wpf窗口仅获取保存图像的一小部分。例如: var screen=System.Windows.Application.Current.Windows.OfType().SingleOrDefault(x=>x.IsActive); v

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

var screen=System.Windows.Application.Current.Windows.OfType().SingleOrDefault(x=>x.IsActive);
var rtb=新的RenderTargetBitmap(4000、4000、96、96,PixelFormats.Pbgra32);
渲染(屏幕);
var enc=new System.Windows.Media.Imaging.PngBitmapEncoder();
enc.Frames.Add(System.Windows.Media.Imaging.BitmapFrame.Create(rtb));
使用(var stm=System.IO.File.Create(“ScreenShot.png”))
{
附件保存(stm);
使用(Image img=Image.FromStream(stm))
{
矩形dest=新矩形(0,0,6000,4000);
使用(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”);
}
}
因此,基本上,我想以4000 x 4000的分辨率拍摄屏幕截图,如果可能的话,不损失质量。
上述代码生成的图像为4000 x 4000,但屏幕截图仅获取其原始分辨率的一小部分。

要缩放图像,可以使用
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);
 }
var w=4000;
var h=4000;
var screen=System.Windows.Application.Current.Windows.OfType().SingleOrDefault(x=>x.IsActive);
var visual=新的DrawingVisual();
使用(var context=visual.RenderOpen())
{
DrawRectangle(新的可视化画笔(屏幕),
无效的
新矩形(新点(),新尺寸(screen.Width,screen.Height));
}
visual.Transform=新的ScaleTransform(w/screen.ActualWidth,h/screen.ActualHeight);
var rtb=新的RenderTargetBitmap(w、h、96、96、PixelFormats.Pbgra32);
渲染(视觉);
var enc=新的PngBitmapEncoder();
enc.Frames.Add(BitmapFrame.Create(rtb));
使用(var stm=File.Create(“ScreenShot.png”))
{
附件保存(stm);
}

所以您有一个小窗口,比如400x400,如果可能的话,您希望将其缩放到4000x4000。若要将其放大一点,并以更高的分辨率保存WPF窗口的图像,可以将图像添加到帖子中吗?感谢您的回答,但不幸的是,这会产生与我的代码完全相同的结果,一幅4000x4000的图像,但屏幕截图的大小相同,只占新生成图像的一小部分image@Mefhisto1我写的是“屏幕”而不是“视觉”。你能试试这个吗?(如果更正后它不起作用,您可以分享您的项目和图片的演示测试吗?)
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);
 }