Je ne peux pas initialiser WriteableBitmap avec BitmapImage

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

Je reçois une erreur d’exécution à la ligne ci-dessus: “La référence à un object n’est pas définie sur une instance d’object.”

La raison pour laquelle vous obtenez l’exception de référence null est que la valeur par défaut de la propriété BitmapCreateOptions.DelayCreation est BitmapCreateOptions.DelayCreation . Vous pouvez le définir sur BitmapCreateOptions.None et créer WriteableBitmap après le chargement de l’image:

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

Si l’action de génération de votre fichier image est définie sur ressource, le code suivant fonctionnera.

 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); 

Notez que la méthode statique GetResourceStream définie par la classe d’application accède à la ressource. Maintenant, si vous modifiez l’action de construction du fichier en Contenu plutôt qu’en Ressource, vous pouvez considérablement simplifier l’identifiant Uri.

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

La différence, au cas où vous vous le demanderiez … Si vous accédez au répertoire Bin / Debug d’un projet Visual Studio et trouvez le fichier XAP contenant votre programme, renommez-le en une extension ZIP. Et regarde à l’intérieur.

Dans les deux cas, le bitmap est généralement stocké quelque part dans le fichier XAP.

  • Avec une action de construction de ressource pour le fichier, il est stocké dans le fichier DLL avec le programme compilé.
  • Avec une action de construction de contenu, le fichier est stocké à l’extérieur du fichier dll mais dans le fichier XAP. Lorsque vous renommez le fichier XAP en fichier ZIP, vous pouvez le voir.