2014-01-28 2 views
7

그래서 WPF C#에서 캔버스의 스냅 사진을 찍어서 png로 저장할 수있게하려고합니다. 왼쪽 여백과 위쪽 여백을 포함하고 있기 때문에 이미지는 현재 잘못 저장됩니다.캔버스를 png C# wpf에 저장

이것은 내가 무엇을 가지고 :

캔버스의 크기의 사각형을 만듭니다. canvas.Margin.Left 및 Top이 0으로 설정된 경우 저장된 이미지의 크기는 정확하지만 오프셋이 여전히 발생하여 하단 및 오른쪽 가장자리가 잘립니다. Margin.Left를 설정하고 최고는 여전히 오프셋이 발생하는 원인이 있지만 전체 이미지가 저장되지만되고있는 잘못된 크기 (margin.Left + ActualWidth)이 아니라보다 단지 ActualWidth

Rect rect = new Rect(canvas.Margin.Left, canvas.Margin.Top, canvas.ActualWidth, canvas.ActualHeight); 

double dpi = 96d; 

RenderTargetBitmap rtb = new RenderTargetBitmap((int)rect.Right, (int)rect.Bottom, dpi, dpi, System.Windows.Media.PixelFormats.Default); 

rtb.Render(canvas); 

BitmapEncoder pngEncoder = new PngBitmapEncoder(); 
pngEncoder.Frames.Add(BitmapFrame.Create(rtb)); 

try 
{ 
    System.IO.MemoryStream ms = new System.IO.MemoryStream(); 

    pngEncoder.Save(ms); 
    ms.Close(); 

    System.IO.File.WriteAllBytes(filename, ms.ToArray()); 
} 
catch (Exception err) 
{ 
    MessageBox.Show(err.ToString(), "Error", MessageBoxButton.OK, MessageBoxImage.Error); 
} 
+0

왜 MemoryStream을 만드나요? FileStream을 생성하고 엔코더를 직접 저장하십시오. –

답변

11

이와 처음 네 줄을 교체 라인

  Rect bounds = VisualTreeHelper.GetDescendantBounds(canvas); 
      double dpi = 96d; 


      RenderTargetBitmap rtb = new RenderTargetBitmap((int)bounds.Width, (int)bounds.Height, dpi, dpi, System.Windows.Media.PixelFormats.Default); 


      DrawingVisual dv = new DrawingVisual(); 
      using (DrawingContext dc = dv.RenderOpen()) 
      { 
       VisualBrush vb = new VisualBrush(canvas); 
       dc.DrawRectangle(vb, null, new Rect(new Point(), bounds.Size)); 
      } 

      rtb.Render(dv); 

이 글 http://mcleodsean.wordpress.com/2008/10/07/bitmap-snapshots-of-wpf-visuals/ (자세한 설명) 다음과 여백이없이 캔버스를 저장할 수있다.

+0

이것은 나를 위해 일하는 솔루션, 덕분에 많이 – Daniel

+0

동일한 문제 가이 솔루션으로 해결했다! – FrancescoDS

+0

매력처럼 작동합니다. 감사합니다. – Anders

관련 문제