Создать 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). Если вы удалите блок using и данные верны, ваш код должен работать. BitmapImage, похоже, не загружает изображение сразу, поэтому не может загрузить его позже, потому что поток уже удален.

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

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

Другие вопросы по тегам