Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Как преобразовать xml в Image?

Максим Лео Знаток (341), открыт 3 недели назад
Я делаю векторный редактор диаграмм и схем(по типу diagrams. net). У меня есть два окна MainWindow и Startup(всплывающее окно с кнопками создать/октрыть диаграмму). Так вот я хочу чтобы у меня xml код преобразовывался в картинку, которая отобразится на канвасе.
Пробовал с chatgpt сделать, он вроде написал, но выдает ошибку Ошибка при открытии диаграммы значение параметра должно быть больше 0(Parameter pixelWidth;). Не знаю как пофиксить

 private DrawingVisual ConvertXmlToDrawingVisual(string xmlFilePath)    
{

// Загружаем XML-файл и анализируем его
XmlDocument xmlDoc = new XmlDocument();

xmlDoc.Load(xmlFilePath);

// Создаем DrawingVisual для отображения содержимого XML
DrawingVisual visual = new DrawingVisual();

// Определяем шрифт и цвет для отображения текста
Typeface typeface = new Typeface("Arial");

Brush foreground = Brushes.Black;

// Создаем контекст рисования
using (DrawingContext context = visual.RenderOpen())
{
// Рекурсивно рисуем содержимое XML
DrawXmlOnVisual(context, xmlDoc.DocumentElement, typeface, foreground, new Point(10, 10));
}
return visual;
}

private void DrawXmlOnVisual(DrawingContext context, XmlNode node, Typeface typeface, Brush foreground, Point point)
{
// Рисуем текущий узел XML
string nodeText = node.Name;

FormattedText formattedText = new FormattedText(nodeText, CultureInfo.InvariantCulture, FlowDirection.LeftToRight, typeface, 12, foreground);

context.DrawText(formattedText, point);

point.Y += formattedText.Height;
// Если текущий узел имеет дочерние элементы, рекурсивно рисуем их
foreach (XmlNode childNode in node.ChildNodes)
{
DrawXmlOnVisual(context, childNode, typeface, foreground, point);
}
}

private void OpenExistingDiagram_Click(object sender, RoutedEventArgs e)
{
// Диалоговое окно открытия файла
OpenFileDialog openFileDialog = new OpenFileDialog();

openFileDialog.Filter = "Диаграммы (*.xml)|*.xml|Все файлы (*.*)|*.*";
if (openFileDialog.ShowDialog() == true)
{
string filename = openFileDialog.FileName;
try
{
// Преобразуем XML в DrawingVisual
DrawingVisual visual = ConvertXmlToDrawingVisual(filename);

// Передаем DrawingVisual обратно в MainWindow для отображения на канвасе
(Application.Current.MainWindow as MainWindow).SetCanvasVisual(visual);

}
catch (Exception ex)
{
MessageBox.Show("Ошибка при открытии диаграммы: " + ex.Message);
}
}
}

public void SetCanvasVisual(DrawingVisual visual)
{
mainArea.Children.Clear();

// Создаем растровое изображение из DrawingVisual
RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap((int)mainArea.Width, (int)mainArea.Height, 96, 96, PixelFormats.Pbgra32);

renderTargetBitmap.Render(visual);
Image image = new Image();
image.Source = renderTargetBitmap;
mainArea.Children.Add(image);
}
2 ответа
Абадон Громов Оракул (63926) 3 недели назад
нажать на виндовс + принтскрин предвратительно открыв хмл картинку , качество не гарантировано , но зато просто
Jurijus Zaksas Искусственный Интеллект (426039) 3 недели назад
Используй сериализацию и десериализацию объектов, а не это кривое поделие.
Максим ЛеоЗнаток (341) 1 неделю назад
а есть какой-то пример кода?или хотя бы есть библиотеки с подобными методами?
Похожие вопросы