2013-03-07 6 views
3

Я создаю массив байтов с произвольными значениями в нем и хочу преобразовать его в 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 из любого массива байтов?

+0

Возможно, вы захотите сделать это: [Как я могу преобразовать byte \ [\] в BitmapImage] (http://stackoverflow.com/a/15272528/1136211) (спросил сегодня). Если это так, вопрос скорее всего будет закрыт как дубликат. – Clemens

+0

Это помогло! Спасибо! – tabina

ответ

7

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

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 и, конечно, также проходят в соответствующей цветовой палитре.

+0

Я думаю, вы имеете в виду делать деление, а не умножение на 8 var bytesPerPixel = (pixelFormat.BitsPerPixel + 7)/8; // == 1 в этом примере –

+0

@SamiKuhmonen Конечно. Спасибо что подметил это. – Clemens

+0

Я разработал [вопрос здесь с вашим кодом] (http://stackoverflow.com/questions/24006334/presentationcore-dll-system-windows-media-imaging-bitmapsource-create-returns). Если вы можете показать, была ли моя неисправность, я с удовольствием удалю все эти комментарии. – wilsotc

1

Байт-массив должен содержать достоверные данные изображения (PNG/JPG/BMP). Если вы удалите блок использования и данные действительны, то ваш код должен работать. BitmapImage, похоже, не сразу загружает изображение, поэтому он не может загрузить его после того, как поток уже удален.

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

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

+0

«bi.CacheOption = BitmapCacheOption.OnLoad» заставит поток считываться и позволит удалять поток. –

+0

В моем примере я имею в виду массив байтов, который заполняется значениями от 0 до 255. – tabina

Смежные вопросы