У меня возникли проблемы при попытке сериализовать объект, содержащий поле BitmapSource.
Фактически, вначале у меня был ImageSource, но он, похоже, не поддавался сериализации. Поэтому я попытался использовать связанное свойство для хранения строки, а также для преобразования и обратного преобразования изображения в / из строки. Но теперь изображение не отображается :-(
вот тег изображения XAML:
<Image
x:Name = "bookCover"
Grid.Row = "0"
Grid.RowSpan = "1"
Grid.Column = "0"
MaxWidth = "200"
MaxHeight = "320"
Margin = "5"
Source = "{Binding Image}" SizeChanged = "bookCover_SizeChanged" >
</Image>
вот свойство и поле Image в классе модели:
public string _image;
public BitmapSource Image
{
get => Base64ToImage(_image);
set
{
_image =ImageToBase64(value);
OnPropertyChanged("Image");
}
}
и связанные с ними методы:
public static string ImageToBase64(BitmapSource bitmap)
{
var encoder = new JpegBitmapEncoder();
var frame = BitmapFrame.Create(bitmap);
encoder.Frames.Add(frame);
using (var stream = new MemoryStream())
{
encoder.Save(stream);
return Convert.ToBase64String(stream.ToArray());
}
}
public static BitmapSource Base64ToImage(string base64)
{
byte[] bytes = Convert.FromBase64String(base64);
using (var stream = new MemoryStream(bytes))
{
return BitmapFrame.Create(stream);
}
}
и вот моя программа извлекает изображение из Интернета через свой URI и сохраняет его:
var myUri=new Uri(book0.LargeImage.URL);
bookToInsert.Image = new BitmapImage(myUri);
Спасибо.
Знаешь, я буду использовать первый рабочий метод, который у меня получится ... строка или массив байтов мне равны. Кстати, мне сложно получить несколько руководств по сериализации изображений и кодировщикам растровых изображений ...





Когда вы создаете BitmapSource из потока, который закрывается сразу после создания, вы должны установить BitmapCacheOption.OnLoad. В противном случае поток должен быть открыт до тех пор, пока BitmapSource не будет фактически использован, например отображается в элементе изображения.
public static BitmapSource Base64ToImage(string base64)
{
using (var stream = new MemoryStream(Convert.FromBase64String(base64)))
{
return BitmapFrame.Create(
stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
}
}
Пара замечаний:
byte[] Image.Попробуйте более простую модель просмотра, например:
public class ViewModel : INotifyPropertyChanged
{
private byte[] image;
public byte[] Image
{
get => image;
set
{
image = value;
OnPropertyChanged(nameof(Image));
}
}
}
и установите свойство Image следующим образом:
var webClient = new WebClient();
viewModel.Image = webClient.DownloadData(book0.LargeImage.URL);
Или асинхронно:
var httpClient = new HttpClient();
viewModel.Image = await httpClient.GetByteArrayAsync(book0.LargeImage.URL);
Не создавайте начальное изображение BitmapImage, как показано в отредактированном ответе.
Вы знаете справочник по фреймворку .net, в который я мог бы погрузиться, чтобы получить такую информацию?
Вы действительно уверены, что хотите сериализовать строку вместо массива байтов?