0

MS Chart (WPF ツールキットから) を PNG にエクスポートできません。私はさまざまなフォーラムの手順に従いますが、結局のところ、私の PNG は完全に黒です。私は何を間違っていますか?

private void export_graf_Click(object sender, RoutedEventArgs e)
        {
            if (mcChart.Series[0] == null)
            {
                MessageBox.Show("there is nothing to export");
            }
            else
            {

           RenderTargetBitmap renderBitmap = new RenderTargetBitmap((int)mcChart.ActualWidth,    (int)mcChart.ActualHeight, 95d, 95d, PixelFormats.Pbgra32);


                renderBitmap.Render(mcChart);

                Microsoft.Win32.SaveFileDialog uloz_obr = new Microsoft.Win32.SaveFileDialog();
                uloz_obr.FileName = "Graf";
                uloz_obr.DefaultExt = "png";


                Nullable<bool> result = uloz_obr.ShowDialog();
                if (result == true)
                {
                    string obr_cesta = uloz_obr.FileName; //cesta k souboru

              using (FileStream outStream = new FileStream(obr_cesta, FileMode.Create))
                    {
                        PngBitmapEncoder encoder = new PngBitmapEncoder();
                        encoder.Frames.Add(BitmapFrame.Create(renderBitmap));
                        encoder.Save(outStream);
                    }

                }
4

1 に答える 1

3

レイアウトの問題が発生していると思います。このRenderTargetBitmapクラスは、ビジュアルの親から継承されたオフセットと変換を含むビジュアル レイヤーで機能します。にレンダリングするときは、ビジュアル要素を分離する必要がありBitmapFrameます。透明な背景が必要でない限り、ウィンドウのビジュアル ツリーに影響を与えずに背景色を指定することもできます。PNG 形式はアルファ透明度をサポートしており、一部の画像ビューアでは透明なピクセルが黒で表示されます。

WPF のデフォルトの dpi は 96 です。95 を指定した理由がわかりません。これはゼロ バインド インデックスなどではありません。以下のサンプルでは 96dpi を使用しています。

private void export_graf_Click(object sender, RoutedEventArgs e)
{
    if (mcChart.Series[0] == null)
    {
        MessageBox.Show("there is nothing to export");
    }
    else
    {
        Rect bounds = VisualTreeHelper.GetDescendantBounds(mcChart);

        RenderTargetBitmap renderBitmap = new RenderTargetBitmap((int)bounds.Width, (int)bounds.Height, 96, 96, PixelFormats.Pbgra32);

        DrawingVisual isolatedVisual = new DrawingVisual();
        using (DrawingContext drawing = isolatedVisual.RenderOpen())
        {
            drawing.DrawRectangle(Brushes.White, null, new Rect(new Point(), bounds.Size)); // Optional Background
            drawing.DrawRectangle(new VisualBrush(mcChart), null, new Rect(new Point(), bounds.Size));
        }

        renderBitmap.Render(isolatedVisual);

        Microsoft.Win32.SaveFileDialog uloz_obr = new Microsoft.Win32.SaveFileDialog();
        uloz_obr.FileName = "Graf";
        uloz_obr.DefaultExt = "png";

        Nullable<bool> result = uloz_obr.ShowDialog();
        if (result == true)
        {
            string obr_cesta = uloz_obr.FileName;

            using (FileStream outStream = new FileStream(obr_cesta, FileMode.Create))
            {
                PngBitmapEncoder encoder = new PngBitmapEncoder();
                encoder.Frames.Add(BitmapFrame.Create(renderBitmap));
                encoder.Save(outStream);
            }
        }
    }
}
于 2012-04-13T15:48:08.223 に答える