Я не могу инициализировать WriteableBitmap с помощью BitmapImage

#c# #silverlight

#c# #silverlight

Вопрос:

  BitmapImage img = new BitmapImage(new Uri("somepath",UriKind.Relative));
 WriteableBitmap wbm = new WriteableBitmap(img);
  

Я получаю ошибку времени выполнения в строке выше: «Ссылка на объект не установлена для экземпляра объекта».

Комментарии:

1. Является ли «path» допустимым путем к файлу? Для действия сборки файла установлено значение «Содержимое» или «Ресурс»?

2. путь правильный, и изображение инициализировано.

Ответ №1:

Причина, по которой вы получаете исключение с нулевой ссылкой, заключается в том, что BitmapImage.Свойство CreateOptions имеет значение по умолчанию BitmapCreateOptions.DelayCreation . Вы можете установить для него значение BitmapCreateOptions.None и создать WriteableBitmap после загрузки изображения:

 BitmapImage img = new BitmapImage(new Uri("somepath",UriKind.Relative));
img.CreateOptions = BitmapCreateOptions.None;
img.ImageOpened  = (s, e) =>
   {
       WriteableBitmap wbm = new WriteableBitmap((BitmapImage)s);
   };
  

Ответ №2:

Если для действия сборки вашего файла изображения установлено значение resource, то следующий код будет работать.

 Uri uri = new Uri("/ProjectName;component/Images/image.jpg", UriKind.Relative);
StreamResourceInfo resourceInfo = Application.GetResourceStream(uri);
BitmapImage img = new BitmapImage();
img.SetSource(resourceInfo.Stream);
WriteableBitmap wbm = new WriteableBitmap(img);
  

Обратите внимание, что доступ к ресурсу осуществляется с помощью статического метода GetResourceStream, определенного классом application.
Теперь, если вы измените действие сборки файла на Content, а не на Resource, вы можете значительно упростить синтаксис Uri.

 Uri uri = new Uri("Images/image.jpg", UriKind.Relative);
  

Разница, если вам интересно…
Если вы перейдете в каталог Bin / Debug проекта Visual Studio и найдете файл XAP, содержащий вашу программу, переименуйте его в ZIP с расширением. И загляни внутрь.

В обоих случаях растровое изображение, очевидно, хранится где-то в файле XAP.

  • При выполнении действия сборки ресурса для файла он сохраняется внутри DLL-файла вместе со скомпилированной программой.
  • При выполнении действия сборки содержимого файл сохраняется вне файла dll, но внутри файла XAP, и когда вы переименовываете файл XAP в ZIP-файл, вы можете его увидеть.