Создание 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 из любого массива байтов?

2 ответа

Учитывая массив байтов, где каждый байт представляет значение пикселя, вы можете создать растровое изображение в градациях серого, как показано ниже. Вам нужно указать ширину и высоту растрового изображения, и это, конечно, должно соответствовать размеру буфера.

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, похоже, не сразу загружает изображение, поэтому он не может загрузить его после того, как поток уже удален.

Что вы подразумеваете под "произвольными значениями"? Случайные значения RGB? Затем я предлагаю использовать класс Bitmap и сохранить полученный Bitmap в Memorystream.

Если вы просто хотите привязать Byte [] и Image Control в своем пользовательском интерфейсе: привязать непосредственно к массиву. Он работает без конвертера.

licensed under cc by-sa 3.0 with attribution.