2016-10-02 3 views
2

Ich greife auf ein Bild von einem BLOB-Speicher auf meinem azure-Dienst zu. Ich gebe das uri für das Bild zurück und benutze dann HttpClient, um es herunterzuladen. Die uri wird als korrekt verifiziert.Konvertieren eines WriteableBitmap-Image ToArray in UWP

using (HttpClient client = new HttpClient()) 
{ 
    try 
    { 
     HttpResponseMessage response = await client.GetAsync(new Uri(((App)Application.Current).results.statsInformation.ImageBlob.ImageUri, UriKind.RelativeOrAbsolute)); 
     if (response != null && response.StatusCode == HttpStatusCode.OK) 
     { 
      using (var stream = await response.Content.ReadAsStreamAsync()) 
      { 
        using (var memStream = new MemoryStream()) 
        { 
         await stream.CopyToAsync(memStream); 
         memStream.Position = 0; 
         memStream.Seek(0, SeekOrigin.Begin); 
         myOnlineImage.SetSource(memStream.AsRandomAccessStream()); 
        } 
       } 
     } 
    } 
    catch (Exception) 
    { 
     throw; 
    } 
} 

das Bild von dem Server wird in den Variablen myOnlineImage gespeichert. Ich möchte dann die Pixelinformation unter Verwendung myOnlineImage.PixelBuffer.ToArray(); extrahieren. Liegt das daran, dass das Bild nicht korrekt heruntergeladen wurde? Kann mir jemand mit Optionen helfen, das zu lösen?

Die Ausnahme, die ich empfangen habe ist:

Exception

Nachricht "Wert nicht null sein kann \ r \ nParameter Name: source"

Stacktrace "bei System.Runtime .InteropServices.Marshal.CopyToManaged (IntPtr-Quelle, Objektziel, Int32-startIndex, Int32-Länge) \ r \ n bei System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeBufferExtensions.CopyTo (IBuffer-Quelle, UInt32-Quellindex, Byte [] -Zielort, Int32 DestinationIndex, Int32-Anzahl) \ r \ n bei System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeBufferExtensions.ToArray (IBuffer-Quelle, UInt32-sourceIndex, Int32-Anzahl) \ r \ n bei System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeBufferExtensions.ToArray (IBuffer-Quelle) \ r \ n bei Stonegaard_endless_runner.MainPage.d__7.MoveNext()“

Zusatz

I überprüft haben, dass I-Thread Zugriff auf das Bild haben.

Antwort

1

In einigen Fällen können Sie System.Runtime.InteropServices nicht verwenden. Der Zeiger myOnlineImage.PixelBuffer ist null. Sie können BitmapImage verwenden, aber nicht WriteableBitmap und konvertieren zu byte[] mit BitmapDecoder, BitmapFrame, PixelDataProvider wie das Beispiel der Msdn:

 byte[] image_array = null; 
     int image_array_width = 0; 
     int image_array_height = 0; 

     using (HttpClient client = new HttpClient()) 
     { 
      try 
      { 
       HttpResponseMessage response = await client.GetAsync(new Uri("http://www.example.com/logo.png", UriKind.RelativeOrAbsolute)); 
       if (response != null && response.StatusCode == HttpStatusCode.OK) 
       { 
        using (Stream stream = await (response.Content.ReadAsStreamAsync())) 
        { 
         using (IRandomAccessStream strm = stream.AsRandomAccessStream()) 
         { 
          strm.Seek(0); 
          BitmapDecoder decoder = await BitmapDecoder.CreateAsync(strm); 
          BitmapFrame bitmapFrame = await decoder.GetFrameAsync(0); 
          // Get the pixels 
          var transform = new BitmapTransform { ScaledWidth = decoder.PixelWidth, ScaledHeight = decoder.PixelHeight }; 
          PixelDataProvider dataProvider = 
          await bitmapFrame.GetPixelDataAsync(BitmapPixelFormat.Bgra8, 
                    BitmapAlphaMode.Straight, 
                    transform, 
                    ExifOrientationMode.RespectExifOrientation, 
                    ColorManagementMode.ColorManageToSRgb); 

          await strm.FlushAsync(); 
          image_array = dataProvider.DetachPixelData(); 
          image_array_width = (int)decoder.PixelWidth; 
          image_array_height = (int)decoder.PixelHeight; 
          } 
        } 
       } 
      } 
      catch (Exception) 
      { 
       throw; 
      } 
     } 
+0

Das Bild ist nicht eine Datei, sondern von einem Server oder von einem anderen Bitmap. Irgendwelche Änderungen, die Sie wissen, um das zu konvertieren, um Ihren Code zu testen? – JTIM

+0

@JTIM Durch Ersetzen der Verwendung mit erwarten Datei durch: mit (Stream = warten (response.Content.ReadAsStreamAsync())) {mit (IRandomAccessStream strm = stream.AsRandomAccessStream()) {... –

+0

Es friert ein, wenn die Zeile 'bi.SetSource (strm)' wird ausgeführt. Danach passiert nichts? – JTIM

Verwandte Themen