2016-04-13 70 views
0

我有一個DVC圖表顯示數據。我創建了一個按鈕來導出圖形。PngBitmapEncoder創建一個「空」文件

下面是代碼:

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(); 
} 

所以我的問題是,這與我的文件基本上是空的異常正確執行。我只有一個1KB大小的文件,沒有圖形。

我看過MSDN文檔和其他堆棧溢出示例。他們都遵循這種形式,人們聲稱它的工作原理。我已經運行了一個調試器,renderBitmap對象在所有必要的屬性中獲得了正確的高度和重量值。有任何想法嗎?

+0

只是要清楚,JpegBitmapEncoder也沒有產生預期的結果? – Clemens

+0

'mcChart.ActualWidth'和'mcChart.ActualHeight'是否大於'0'?您的圖表控件或者需要在屏幕上實際可見,以便能夠將其渲染到RenderTargetBitmap,或者您必須調用Measure()和Arrange()。 – bitbonk

+0

你是對的,JpegBitmapEncoder也沒有產生期望的結果。我得到了一個2KB的文件,但我相信這只是因爲jpeg文件無論如何都比較大。 是的mcChart.ActualWidth和mcChart.actualHeight大於0.它們分別是200和300左右。通過在屏幕上可見,我假定你的意思是我可以看到圖表?如果是這樣,是的。 – SDSMTKyzer

回答

0

我的朋友去看看它,這是我們想出了和沒有工作的解決方案:

 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");