Визуализация визуального объекта WPF как изображения приводит к получению сплошного черного изображения - PullRequest
4 голосов
/ 01 июня 2011

В приложении C # / WPF у меня есть объект DataChart, который мне нужно сохранить в изображение. В настоящее время объект добавляется в фиксированный документ и корректно отображается в этом фиксированном документе с использованием следующего кода:

VisualBrush chartBrush = new VisualBrush(chart);
Rectangle chartRect = new Rectangle();
chartRect.Height = chartClone.Height;
chartRect.Width = chartClone.Width;
chartRect.Fill = chartBrush;
AddBlockUIElement(chartRect, textAlignment);

Однако вместо того, чтобы добавить его в качестве блока в фиксированный документ, мне теперь нужно просто сохранить изображение на диск. Я пытался сделать следующее:

RenderTargetBitmap bmp = new RenderTargetBitmap((int)chart.Width, (int)chart.Height, 96, 96, PixelFormats.Default);
bmp.Render(chart);
PngBitmapEncoder image = new PngBitmapEncoder();
image.Frames.Add(BitmapFrame.Create(bmp));
using (Stream fs = File.Create("TestImage.png"))
{
  image.Save(fs);
  fs.Close();
}

Однако это просто дает мне сплошное черное изображение размером с мою диаграмму, и я не могу понять, почему.

Итак, мой вопрос: кто-нибудь знает, как лучше превратить объект DataChart в изображение PNG или BMP, которое я могу сохранить? Я попытался выполнить поиск при переходе от VisualBrush или Rectangle к изображению, но не нашел ничего, кроме вышеприведенного, которое, кажется, делает то, что мне нужно.

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 01 июня 2011

заменить эту строку

image.Frames.Add(BitmapFrame.Create(BitmapRender));

на такие

image.Frames.Add(BitmapFrame.Create(bmp));
0 голосов
/ 01 июня 2011

Посмотрите, можете ли вы работать с кодом ниже:

VisualBrush target = new VisualBrush(element);
DrawingVisual visual = new DrawingVisual();
DrawingContext dc = visual.RenderOpen();
dc.DrawRectangle(target, null, new Rect(0, 0, 
    width, 
    height));
dc.Close();

RenderTargetBitmap bmp = new RenderTargetBitmap(
    (int)width,
    (int)height, 96, 96, PixelFormats.Pbgra32);
bmp.Render(visual); 
...