Как установить источник изображения WPF в качестве байтового массива в коде C#?

Я строю небольшое приложение с использованием C#/WPF.

Приложение получает (из неуправляемой библиотеки C++) байтовый массив (byte[]) из источника растрового изображения

В моем окне WPF у меня есть изображение (System.windows.Controls.Image), которое я буду использовать для отображения растрового изображения.

В коде (C#) мне нужно взять этот байтовый массив, создать BitmapSource /ImageSource и назначить источник для моего элемента управления изображением.

// byte array source from unmanaged librariy
byte[] imageData; 

// Image Control Definition
System.Windows.Controls.Image image = new Image() {width = 100, height = 100 };

// Assign the Image Source
image.Source = ConvertByteArrayToImageSource(imageData);

private BitmapSource ConvertByteArrayToImagesource(byte[] imageData)
{
    ??????????
}

Я работал над этим немного здесь и не смог понять это. Я пробовал несколько решений, которые я нашел, прогуливаясь вокруг. На сегодняшний день я не смог понять это.

Я пробовал:

1) Создание BitmapSource

var stride = ((width * PixelFormats.Bgr24 +31) ?32) *4);
var imageSrc = BitmapSource.Create(width, height, 96d, 96d, PixelFormats.Bgr24, null, imageData, stride);

Что из-за исключения времени выполнения, говоря, что буфер слишком мал, размер буфера недостаточен

2) Я пытался использовать поток памяти:

BitmapImage bitmapImage = new BitmapImage();
using (var mem = new MemoryStream(imageData))
{
   bitmapImage.BeginInit();
   bitmapImage.CrateOptions = BitmapCreateOptions.PreservePixelFormat;
   bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
   bitmapImage.StreamSource = mem;
   bitmapImage.EndInit();
   return bitmapImage;
}

Этот код через исключение при вызове EndInit(). "Не найдено ни одного компонента, подходящего для выполнения этой операции".

SOS! Я провел пару дней на этом и явно застрял. Любая помощь / идеи / направления будет принята с благодарностью.

Спасибо, ДжонБ

1 ответ

Решение

Ваш расчет шага неверен. Это число полных байтов на строку сканирования, и поэтому его следует вычислять следующим образом:

var format = PixelFormats.Bgr24;
var stride = (width * format.BitsPerPixel + 7) / 8;

var imageSrc = BitmapSource.Create(
    width, height, 96d, 96d, format, null, imageData, stride);

Конечно, вы также должны убедиться, что вы используете правильный размер изображения, т.е. width а также height значения на самом деле соответствуют данным в imageBuffer,

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