#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. Я изменил код. Отсутствует преобразование с размерами изображения! Я удалил бесполезное растровое изображение. Это работает для меня.