2016-04-13 16 views
0

Verileri görüntüleyen bir DVC Grafiğim var. Grafiği dışa aktarmak için bir düğme oluşturdum. PngBitmapEncoder bir "boş" dosya yaratıyor

private void btnExptGraph_Click(object sender, RoutedEventArgs e) 
{ 
    RenderTargetBitmap renderBitmap = new RenderTargetBitmap((int)mcChart.ActualWidth, (int)mcChart.ActualHeight,96d, 96d, PixelFormats.Pbgra32); 
    renderBitmap.Render(mcChart); 

    Console.WriteLine(renderBitmap.ToString()); 

    //JpegBitmapEncoder encode = new JpegBitmapEncoder(); 
    PngBitmapEncoder encode = new PngBitmapEncoder(); 
    encode.Frames.Add(BitmapFrame.Create(renderBitmap)); 

    string filename = "test.bmp"; 

    FileStream fout = new FileStream(filename, FileMode.Create); 

    encode.Save(fout); 

    MessageBox.Show("File Saved Successfully"); 
    fout.Close(); 
} 

Yani benim mesele bu benim dosya temelde boş hariç düzgün yürütür olmasıdır: Burada

kodudur. Sadece 1 KB boyutunda bir dosyam var ve grafik yok.

MSDN belgelerine ve diğer yığın taşması örneklerine baktım. Hepsi bu formu takip ediyor ve insanlar işe yarayacağını iddia ediyorlar. Bir hata ayıklayıcısını kullanarak çalışıyorum ve renderBitmap nesnesi, gerekli tüm özelliklerde doğru yükseklik ve ağırlık değerlerini alıyor. Herhangi bir fikir?

+0

Sadece açıklığa kavuşturmak için, JpegBitmapEncoder da istenen sonucu vermiyor? – Clemens

+0

'mcChart.ActualWidth' ve' mcChart.ActualHeight' '0''dan daha büyük mü? Grafik kontrolünüzün ya bir 'RenderTargetBitmap' haline getirilmesi için ekranda gerçekten görünmesi gerekir ya da 'Measure()' ve 'Arrange()' olarak adlandırmanız gerekir. – bitbonk

+0

Doğru, JpegBitmapEncoder istenilen sonucu üretmiyor. Bunun dışında 2KB'lik bir dosya alıyorum ama bunun sadece jpeg dosyalarının daha büyük olduğu için olduğuna inanıyorum. Ve evet mcChart.ActualWidth ve mcChart.actualHeight 0'dan büyüktür. Bunlar sırasıyla 200 ve 300 civarındadır. Ekranda görünerek, grafiği görebildiğimi mi kastediyorsunuz? Eğer öyleyse, evet. – SDSMTKyzer

cevap

0

Arkadaşım ona bir göz attık ve bu bizim çalışma ile geldi ve does çözüm oldu:

 Size size = new Size(mcChart.ActualWidth, mcChart.ActualHeight); 
     if (size.IsEmpty) 
      return; 

     size.Height *= 2; 
     size.Width *= 2; 

     RenderTargetBitmap result = new RenderTargetBitmap((int)size.Width, (int)size.Height, 96, 96, PixelFormats.Pbgra32); 

     DrawingVisual drawingvisual = new DrawingVisual(); 
     using (DrawingContext context = drawingvisual.RenderOpen()) 
     { 
      context.DrawRectangle(new VisualBrush(mcChart), null, new Rect(new Point(), size)); 
      context.Close(); 
     } 
     result.Render(drawingvisual); 

     string filename = "test.png"; 
     FileStream fout = new FileStream(filename, FileMode.Create); 

     PngBitmapEncoder encoder = new PngBitmapEncoder(); 
     encoder.Frames.Add(BitmapFrame.Create(result)); 

     encoder.Save(fout); 

     fout.Close(); 
     MessageBox.Show("Done");