2015-05-07 35 views
2

當我拍攝當前WPF窗口的截圖時,圖像分辨率是我的顯示器的圖像分辨率(如果應用程序已最大化),這沒關係。但是,如果我要將該圖像打印成更大的圖像,則圖像看起來很模糊。我找到了捕獲當前窗口的方法,並將它保存爲一個PNG文件,但它並沒有做到這一點。圖像以我設置的分辨率保存,但實際的wpf窗口只佔保存圖像的一小部分。例如摘自:在不丟失質量的情況下拍攝具有預定義圖片大小的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"); 
      } 
     } 

所以基本上,我想捕捉的4000 X 4000分辨率的截圖,如果可能的話,不失質量。 上面的代碼產生4000 x 4000的圖像,但截圖僅佔其原始分辨率的一小部分。

+0

所以,你有一個小窗口,說400×400,並希望將其擴展到4000x4000?如果可能的話,可以使用 – Default

+0

。將其縮小一點,然後用更多分辨率保存WPF窗口的圖像 – Mefhisto1

+0

可以將圖像添加到帖子中嗎? – aloisdg

回答

4

爲了擴展你的形象,你可以使用DrawingVisualScaleTransform

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

感謝您的答案,但不幸的是,這產生了與我的代碼完全相同的結果,一張4000x4000的圖像,但屏幕截圖大小相同,僅佔新生成圖像的一小部分 – Mefhisto1

+0

@ Mefhisto1我寫了「屏幕「而不是」視覺「。你可以試試這個嗎? (如果改正後沒有工作,你可以分享一個你的項目和你的照片的演示測試?) – aloisdg

+0

做了詭計,謝謝:) – Mefhisto1

相關問題