Как установить источник изображения 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
,