Преобразование записываемого изображения BITMAP в массив в UWP

#c# #uwp #writeablebitmap

#c# #uwp #доступная для записи bitmap

Вопрос:

Я получаю доступ к изображению из хранилища больших двоичных объектов в моей службе Azure. Я возвращаю uri для изображения, а затем использую HttpClient, чтобы попытаться загрузить его. uri Проверяется правильность.

 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 amp;amp; 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(); . Это потому, что изображение было загружено неправильно? Кто-нибудь может помочь мне с вариантами решения этой проблемы?

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

Исключение

Сообщение «Значение не может быть нулевым.rПпараметр имя: источник»

Отслеживание стека » в System.Runtime.Службы взаимодействия.Маршалирование.CopyToManaged(IntPtr источник, назначение объекта, начальный индекс Int32, длина Int32) r n в System.Runtime.Службы взаимодействия.Время работы Windows.WindowsRuntimeBufferExtensions.Копирование в (источник IBuffer, индекс источника UInt32, пункт назначения Byte[], индекс назначения Int32, количество Int32) r n в System.Runtime.Службы взаимодействия.Время работы Windows.WindowsRuntimeBufferExtensions.В массив (источник IBuffer, индекс источника UInt32, количество Int32) r n в System.Runtime.Службы взаимодействия.Время работы Windows.WindowsRuntimeBufferExtensions.В массив (источник IBuffer) r n в Stonegaard_endless_runner.MainPage.d__7.MoveNext()»

Дополнительно

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

Ответ №1:

В некоторых случаях вы не можете использовать System.Runtime.InteropServices . Указатель myOnlineImage.PixelBuffer равен нулю. Вы можете использовать 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 amp;amp; 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;
            }
        }
  

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

1. Изображение не является файлом, а скорее с сервера или из другого растрового изображения. Какие-либо изменения, которые вы знаете, как преобразовать, чтобы протестировать свой код?

2. @JTIM Путем замены файла using на await с помощью: using (Поток потока = await (ответ. Содержание. ReadAsStreamAsync())) { используя (IRandomAccessStream strm = stream. AsRandomAccessStream()) { …

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

4. Размер изображения правильный, но данные в пикселях кажутся полностью 0,0,0,255.

5. Я изменил код. Отсутствует преобразование с размерами изображения! Я удалил бесполезное растровое изображение. Это работает для меня.