Рендеринг визуального объекта WPF в виде изображения дает сплошное черное изображение

В приложении 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 к изображению, но не нашел ничего, кроме приведенного выше, что, похоже, делает то, что мне нужно.

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


person JToland    schedule 01.06.2011    source источник
comment
Плохая новость заключается в том, что я почти уверен, что это проблема с драйвером/графической картой, так как она должна работать. Попробуйте обновить драйвер или попробовать свой код на другом компьютере (или в другой ОС). Продолжаем работать над хорошими новостями :)   -  person Blindy    schedule 01.06.2011


Ответы (2)


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

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); 
person tofutim    schedule 01.06.2011
comment
Это дает мне то же самое — большой сплошной черный прямоугольник. - person JToland; 01.06.2011

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

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

с таким

image.Frames.Add(BitmapFrame.Create(bmp));
person Eugen    schedule 01.06.2011
comment
Извините, на самом деле это была опечатка - у меня это уже было, просто изменилось, когда я задавал вопрос. Но спасибо за улов! - person JToland; 01.06.2011
comment
Я использую такой код pastebin.com/up3JGuFw в своем проекте, и он отлично работает. - person Eugen; 01.06.2011