Как сохранить изображение с размером, местоположением и поворотом, а затем восстановить его?

В WPF у меня есть изображение, которое помещается на InkCanvas и добавляется как дочерний элемент:

    ImageInfo image_Info = e.Data.GetData(typeof(ImageInfo)) as ImageInfo;
        if (image_Info != null)
        {
            Image image = new Image();
            image.Width = image_Info.Width * 4;
            image.Stretch = Stretch.Uniform;
            image.Source = new BitmapImage(image_Info.Uri);
            Point position = e.GetPosition(ic);

            InkCanvas.SetLeft(image, position.X);
            InkCanvas.SetTop(image, position.Y);
            ic.Children.Add(image);
     }

Затем с помощью декоратора изображение перемещается и изменяется его размер. Затем он сохраняется в базе данных как:

 public List<string> Children;

 var uiList = ic.Children.Cast<UIElement>().ToList();
            foreach (var p in uiList)
            {
                string uis = System.Windows.Markup.XamlWriter.Save(p);
                s.Add(uis);
            }
            Children = s;

Затем дети отправляются в базу данных. Результирующая запись в базе данных выглядит так:

"<Image Source="pack://application:,,,/Images/Female - Front.png" Stretch="Uniform" Width="Auto" InkCanvas.Top="296" InkCanvas.Left="695" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" /> "

Нет ссылки на новое местоположение, размер или поворот изображения — только его начальная точка. Повторное создание образа с помощью xmlreader восстанавливает исходную точку и размер изображения.

foreach (string s in behavior.Children)
            {
                var stringReader = new StringReader(s);
                var xmlReader = System.Xml.XmlReader.Create(stringReader, new System.Xml.XmlReaderSettings());

                Image b = (Image)System.Windows.Markup.XamlReader.Load(xmlReader);
                ic.Children.Add(b);
            }

(Источник изображения упакован как ресурс приложения).

Как я могу сохранить изображение с его размером, местоположением и поворотом, а затем восстановить его?

ТИА.


person Alan Wayne    schedule 22.04.2017    source источник
comment
Вы вообще не должны сериализовать и десериализовать XAML. Лучше создайте правильный класс модели со всеми необходимыми данными, описывающими текущее представление. Затем загрузите и сохраните экземпляры этого класса модели.   -  person Clemens    schedule 22.04.2017


Ответы (1)


  1. Либо вы можете добавить дополнительные поля в свою таблицу БД для размера / местоположения / вращения и хранить там информацию.

  2. Или вы можете добавить эти поля вместе через запятую (,) и сохранить в поле Tag вашего элемента управления Image. <Image Tag="(120,230);(50,50);(-30)" ... />

Вы также можете сохранить все обработанное изображение как byte[] в БД.

Пожалуйста, сообщите, решит ли это вашу проблему.

person AnjumSKhan    schedule 22.04.2017
comment
Как оказалось, приведенный выше код работает правильно после удаления декоративных элементов. Однако мне очень нравится ваша идея хранить дополнительную информацию в теге в виде строки. Я считаю, что xamlwriter будет правильно записывать строковые данные для сохранения, что позволит идентифицировать изображение между интерфейсом и базой данных. Хорошая идея. Спасибо. - person Alan Wayne; 22.04.2017