0

J'utilise ce code pour écrire un tableau d'octets dans un fichier BMP:Créer un BitmapImage à partir d'un tableau d'octets et l'afficher sur un objet Image UWP Raspberry Pi 3

private async void ScriviBMP() 
    { 
     using (Stream stream = immagineBitmap.PixelBuffer.AsStream()) 
     { 
      await stream.WriteAsync(arrayImmagine, 0, arrayImmagine.Length); 
     } 
     StorageFolder folder = KnownFolders.PicturesLibrary; 
     if (folder != null) 
     { 
      StorageFile file = await folder.CreateFileAsync("area2_128x128" + ".bmp", CreationCollisionOption.ReplaceExisting); 
      using (var storageStream = await file.OpenAsync(FileAccessMode.ReadWrite)) 
      { 
       var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.BmpEncoderId, storageStream); 
       var pixelStream = immagineBitmap.PixelBuffer.AsStream(); 
       var pixels = new byte[pixelStream.Length]; 
       await pixelStream.ReadAsync(pixels, 0, pixels.Length); 
       encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore, (uint)immagineBitmap.PixelWidth, (uint)immagineBitmap.PixelHeight, 48, 48, pixels); 
       await encoder.FlushAsync(); 
      } 
     } 
    } 

Ensuite, j'utilise ce Code pour afficher l'image BMP dans un objet image

private async void VisBMP() 
    { 
     var file = await KnownFolders.PicturesLibrary.GetFileAsync("area2_128x128.bmp"); 
     using (var fileStream = (await file.OpenAsync(Windows.Storage.FileAccessMode.Read))) 
     { 
      var bitImg = new BitmapImage(); 
      //bitImg.UriSource = new Uri(file.Path); 
      bitImg.SetSource(fileStream); 
      image.Source = bitImg; 
     } 
    } 

ces fonctions prennent environ 400 millisecondes pour terminer le processus, qui est beaucoup de temps. Existe-t-il un moyen d'éviter l'utilisation d'un fichier BMP et d'utiliser uniquement un flux pour afficher l'image sur l'objet image? Il peut être que le débogage du programme peut ralentir les processus? J'utilise Visual Studio 2015.

+1

Est-ce que 'immagineBitmap' est un WriteableBitmap? Vous pouvez ensuite l'assigner directement à la propriété Source du contrôle Image, comme 'image.Source = immagineBitmap;' – Clemens

Répondre

0

Vous pouvez transférer la mémoire tampon de données (arrayImmagine) à l'image dans InMemoryRandomAccessStream codes .Ces prennent environ 200ms.I testé avec des morceaux de code suivant. En outre, vous pouvez référencer ce article pour obtenir plus d'informations.

 BitmapImage biSource = new BitmapImage(); 
     using (InMemoryRandomAccessStream stream = new InMemoryRandomAccessStream()) 
     { 
      await stream.WriteAsync(bytes.AsBuffer()); 
      stream.Seek(0); 
      await biSource.SetSourceAsync(stream); 
     } 

     image.Source = biSource; 
+0

Bien que cela soit vrai, il semble tout à fait redondant. OP pourrait très certainement assigner directement leur WriteableBitmap à la Source de l'Image. – Clemens

+0

J'ai essayé d'assigner directement WriteableBitmap à la source de l'image, mais elle ne peut pas afficher l'image correctement. –