2016-10-02 3 views
2

Я получаю доступ к изображению из хранилища blob на моей службе azure. Я возвращаю uri для изображения, а затем использует HttpClient, чтобы попробовать его загрузить. uri проверяется правильность.Преобразование файла WriteableBitmap ToArray в 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; 
    } 
} 

Изображение с сервера хранится в переменной myOnlineImage. Затем я хочу извлечь информацию о пикселях, используя myOnlineImage.PixelBuffer.ToArray();. Это потому, что изображение не было загружено правильно? Может ли кто-нибудь помочь мне с вариантами решения этого?

Исключение, я получаю это:

Исключение

Сообщение "Значение не может быть пустым \ г \ nParameter имя: источник"

StackTrace "в System.Runtime .InteropServices.Marshal.CopyToManaged (источник IntPtr, назначение объекта, Int32 startIndex, длина Int32) \ r \ n в System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeBufferExtensions.CopyTo (источник IBuffer, UInt32 sourceIndex, Byte [] destination, Int32 destinationIndex, Int32 count) \ r \ n в System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeBufferExtensions.ToArray (источник IBuffer, UInt32 sourceIndex, количество Int32) \ r \ n в System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeBufferExtensions.ToArray (источник IBuffer) \ г \ п на Stonegaard_endless_runner.MainPage.d__7.MoveNext()»

Extra

Я проверил, что у меня есть доступ потоков к изображению.

ответ

1

В некоторых случаях вы не можете использовать System.Runtime.InteropServices. Указатель myOnlineImage.PixelBuffer есть null. Вы можете использовать BitmapImage, но не WriteableBitmap и конвертировать в byte[] с BitmapDecoder, BitmapFrame, PixelDataProvider как пример 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

Изображение не является файлом, а с сервера или из другого BitmapImage. Любые изменения, которые вы знаете, как их преобразовать, чтобы проверить свой код? – JTIM

+0

@JTIM Заменив использование файла ожидания на: using (Stream stream = await (response.Content.ReadAsStreamAsync())) {using (IRandomAccessStream strm = stream.AsRandomAccessStream()) {... –

+0

Он зависает, когда выполняется строка 'bi.SetSource (strm)'. После этого ничего не происходит? – JTIM

Смежные вопросы