Top.Mail.Ru
Ответы

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

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

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
 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);    
        } 
По дате
По рейтингу
Аватар пользователя
Искусственный Интеллект

Используй сериализацию и десериализацию объектов, а не это кривое поделие.

Аватар пользователя
Оракул

нажать на виндовс + принтскрин предвратительно открыв хмл картинку , качество не гарантировано , но зато просто