ユーザーに表示しているグラフがあり、グラフを画像としてディスクにエクスポートして、アプリケーションの外部(プレゼンテーションなど)で使用できるようにしたいと考えています。
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);
}
}
だから私はこのようなものを出します:
これは大きいですが、何もグラフ化されていないため、役に立ちません。