Создание BitmapImage из массива байтов
Я создаю массив байтов с произвольными значениями в нем и хочу преобразовать его в BitmapImage.
bi = new BitmapImage(); using (MemoryStream stream = new MemoryStream(data)) { try { bi.BeginInit(); bi.CacheOption = BitmapCacheOption.OnLoad; bi.StreamSource = stream; bi.DecodePixelWidth = width; bi.EndInit(); } catch (Exception ex) { return null; } }
Этот код всегда дает мне исключение NotSupportedException. Как я могу создать BitmapSource из любого массива байтов?
- Каков наилучший способ передать событие в ViewModel?
- Установить цвет выделения выделенного элемента ComboBox
- Есть ли эквивалент MessageBox в WPF?
- Связывание в WPF с элементом массива, заданным свойством
- Плоская кнопка wpf
- WPF: привязать DataGrid к списку
- Лучший способ использовать векторное изображение в WPF?
- Как SynchronizationContext.Current основного streamа становится нулевым в приложении Windows Forms?
- Что означает «{x: Static}» в XAML?
- Призматическое подстановочное взаимодействие
- WPF. Должен ли пользовательский элемент управления иметь свой собственный ViewModel?
- Использование MediaElement для воспроизведения видео из Stream
- Исключение (исключения) задачи не наблюдалось ни при ожидании задачи, ни при доступе к ее свойству Exception. В результате необнаруженное исключение было
Учитывая массив байтов, где каждый байт представляет значение пикселя, вы можете создать bitmap в gradleациях серого, как показано ниже. Вам нужно указать ширину и высоту растрового изображения, и это, конечно, должно совпадать с размером буфера.
byte[] buffer = ... // must be at least 10000 bytes long in this example var width = 100; // for example var height = 100; // for example var dpiX = 96d; var dpiY = 96d; var pixelFormat = PixelFormats.Gray8; // grayscale bitmap var bytesPerPixel = (pixelFormat.BitsPerPixel + 7) / 8; // == 1 in this example var stride = bytesPerPixel * width; // == width in this example var bitmap = BitmapSource.Create(width, height, dpiX, dpiY, pixelFormat, null, buffer, stride);
Каждое значение байта также может представлять собой индекс в цветовой палитре, и в этом случае вам нужно будет указать PixelFormats.Indexed8
и, конечно же, передать соответствующую цветовую палитру.
Байт-массив должен содержать достоверные данные изображения (PNG / JPG / BMP). Если вы удалите используемый блок и данные будут действительны, ваш код должен работать. BitmapImage, похоже, не сразу загружает изображение, поэтому он не может загрузить его после того, как stream уже удален.
Что вы подразумеваете под «произвольными значениями»? Случайные значения RGB? Затем я предлагаю использовать class Bitmap и сохранять полученный Bitmap в Memorystream.
Если вы просто хотите привязать Byte [] и Image Control к вашему пользовательскому интерфейсу: привязать непосредственно к массиву. Он работает без конвертера.