6

ユーザーに表示しているグラフがあり、グラフを画像としてディスクにエクスポートして、アプリケーションの外部(プレゼンテーションなど)で使用できるようにしたいと考えています。

PngBitmapEncoderとRenderTargetBitmapを使用して基本的なアイデアを機能させることができましたが、そこから得られる画像は非常に小さく、実際に使用できるようになっているため、はるかに大きな画像を取得したいと考えています。

レンダリングしたいコントロールの高さと幅を単純に増やしようとしましたが、親がレンダリングサイズを直接制御しているようです。これから、メモリ内のUIElementを複製しようとしましたが、レンダリングサイズは(0,0)であり、Measure()Arrange()やUpdateLayout()などのメソッドを使用してレンダリングしようとすると、次のような例外がスローされます。これらを呼び出すために親を分離する必要がありますが、メモリ内にあり、レンダリングされていないため、親は存在しないはずですか?

これはすべてVisibloxチャートAPIで行われます

これが私が現在持っているものですが、それは機能しません:(

var width = 1600;
var height = 1200;

var newChart = new Chart { Width = width, Height = height, Title = chart.Title, XAxis = chart.XAxis, YAxis = chart.YAxis, Series = chart.Series};
Debug.WriteLine(newChart.RenderSize);
var size = new Size(width, height);
newChart.Measure(size);
newChart.Arrange(new Rect(size));
newChart.UpdateLayout();
Debug.WriteLine(newChart.RenderSize);

var rtb = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);
            rtb.Render(newChart);

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

using (var stream = fileDialog.OpenFile())
   encoder.Save(stream);

少し近づきました。グラフの背景を軸などにレンダリングしますが、グラフ化されている実際の線だけではありません。以下は更新されたソースです

public static void RenderChartToImage(Chart elementToRender, string filename)
{
    if (elementToRender == null)
        return;
    Debug.Write(elementToRender.RenderSize);
    var clone = new Chart();

    clone.Width = clone.Height = double.NaN;
    clone.HorizontalAlignment = HorizontalAlignment.Stretch;
    clone.VerticalAlignment = VerticalAlignment.Stretch;
    clone.Margin = new Thickness();

    clone.Title = elementToRender.Title;
    clone.XAxis = new DateTimeAxis();
    clone.YAxis = new LinearAxis() { Range = Range<double>)elementToRender.YAxis.Range};

    foreach (var series in elementToRender.Series)
    {
        var lineSeries = new LineSeries
                             {
                                 LineStroke = (series as LineSeries).LineStroke,
                                 DataSeries = series.DataSeries
                             };
        clone.Series.Add(lineSeries);
    }


    var size = new Size(1600, 1200);

    clone.Measure(size);
    clone.Arrange(new Rect(size));
    clone.UpdateLayout();

    Debug.Write(clone.RenderSize);

    var height = (int)clone.ActualHeight;
    var width = (int)clone.ActualWidth;

    var renderer = new RenderTargetBitmap(width, height, 96d, 96d, PixelFormats.Pbgra32);

    renderer.Render(clone);

    var pngEncoder = new PngBitmapEncoder();
    pngEncoder.Frames.Add(BitmapFrame.Create(renderer));

    using (var file = File.Create(filename))
    {
        pngEncoder.Save(file);
    }
}

だから私はこのようなものを出します: チャート

これは大きいですが、何もグラフ化されていないため、役に立ちません。

4

3 に答える 3

3

http://www.visiblox.com/blog/2011/05/printing-visiblox-charts

私が見逃していた主なポイントは

InvalidationHandler.ForceImmediateInvalidate = true;

グラフをメモリにレンダリングする前にこれを設定し、終了したら元に戻します。そこからは順調な航海でした:D

于 2011-10-03T00:39:33.977 に答える
2
RenderTargetBitmap DrawToImage<T>(T source, double scale) where T:FrameworkElement
{
    var clone = Clone(source);
    clone.Width = clone.Height = Double.NaN;
    clone.HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch;
    clone.VerticalAlignment = System.Windows.VerticalAlignment.Stretch;
    clone.Margin = new Thickness();
    var size = new Size(source.ActualWidth * scale, source.ActualHeight * scale);
    clone.Measure(size);
    clone.Arrange(new Rect(size));

    var renderBitmap = new RenderTargetBitmap((int)clone.ActualWidth, (int)clone.ActualHeight, 96, 96, PixelFormats.Pbgra32);
    renderBitmap.Render(clone);
    return renderBitmap;
}

static T Clone<T>(T source) where T:UIElement
{
    if (source == null)
        return null;
    string xaml = XamlWriter.Save(source);
    var reader = new StringReader(xaml);
    var xmlReader = XmlTextReader.Create(reader, new XmlReaderSettings());
    return (T)XamlReader.Load(xmlReader);
}
于 2011-09-27T04:55:01.523 に答える
1

私はこれらが役立つかもしれないと思います:

ダウンロード可能なSilverlightソリューションを使用してVisifireSilverlightチャートを画像としてエクスポートします。

WPFでの画像としてのチャートのエクスポート

于 2011-09-27T04:12:01.353 に答える