Как преобразовать байт [] в BitmapImage?
У меня есть byte[]
, который представляет необработанные данные изображения. Я хотел бы преобразовать его в BitmapImage
.
Я попробовал несколько примеров, которые я нашел, но я продолжал получать следующее исключение.
"Никакой компонент изображения, подходящий для завершения этой операции, не найден".
Я думаю, что это потому, что мой byte[]
фактически не представляет изображение, а только сырые биты.
поэтому мой вопрос, как упоминалось выше, заключается в том, как преобразовать байт [] исходных бит в BitmapImage
.
Ответы
Ответ 1
Когда ваш массив байтов содержит растровые исходные пиксельные данные, вы можете создать BitmapSource
(который является базовым классом BitmapImage
) статическим методом BitmapSource.Create
.
Однако вам нужно указать несколько параметров растрового изображения. Вы должны заранее знать ширину и высоту, а также PixelFormat
буфера.
byte[] buffer = ...;
var width = 100; // for example
var height = 100; // for example
var dpiX = 96d;
var dpiY = 96d;
var pixelFormat = PixelFormats.Pbgra32; // for example
var bytesPerPixel = (pixelFormat.BitsPerPixel + 7) / 8;
var stride = bytesPerPixel * width;
var bitmap = BitmapSource.Create(width, height, dpiX, dpiY,
pixelFormat, null, buffer, stride);
Ответ 2
public static BitmapImage LoadFromBytes(byte[] bytes)
{
using (var stream = new MemoryStream(bytes))
{
stream.Seek(0, SeekOrigin.Begin);
var image = new BitmapImage();
image.BeginInit();
image.StreamSource = stream;
image.EndInit();
return image;
}
}
Ответ 3
Я столкнулся с этой же ошибкой, но это произошло потому, что мой массив не заполнялся фактическими данными. У меня был массив байтов, который был равен длине, на которой он должен был быть, но значения были все еще 0
- они не были записаны на!
Моя особая проблема - и я подозреваю, что другие, которые приходят к этому вопросу, также - были из-за параметра OracleBlob
. Я не думал, что мне это нужно, и подумал, что могу просто сделать что-то вроде:
DataSet ds = new DataSet();
OracleCommand cmd = new OracleCommand(strQuery, conn);
OracleDataAdapter oraAdpt = new OracleDataAdapter(cmd);
oraAdpt.Fill(ds)
if (ds.Tables[0].Rows.Count > 0)
{
byte[] myArray = (bytes)ds.Tables[0]["MY_BLOB_COLUMN"];
}
Как я ошибался! Чтобы фактически получить реальные байты в этом блобе, мне нужно было прочитать этот результат в объекте OracleBlob
. Вместо заполнения набора данных /datatable я сделал следующее:
OracleBlob oBlob = null;
byte[] myArray = null;
OracleCommand cmd = new OracleCommand(strQuery, conn);
OracleDataReader result = cmd.ExecuteReader();
result.Read();
if (result.HasRows)
{
oBlob = result.GetOracleBlob(0);
myArray = new byte[oBlob.Length];
oBlob.Read(array, 0, Convert.ToInt32(myArray.Length));
oBlob.Erase();
oBlob.Close();
oBlob.Dispose();
}
Тогда я мог бы взять myArray
и сделать это:
if (myArray != null)
{
if (myArray.Length > 0)
{
MyImage.Source = LoadBitmapFromBytes(myArray);
}
}
И моя пересмотренная функция LoadBitmapFromBytes
из другого ответа:
public static BitmapImage LoadBitmapFromBytes(byte[] bytes)
{
var image = new BitmapImage();
using (var stream = new MemoryStream(bytes))
{
stream.Seek(0, SeekOrigin.Begin);
image.BeginInit();
image.StreamSource = stream;
image.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
image.CacheOption = BitmapCacheOption.OnLoad;
image.UriSource = null;
image.EndInit();
}
return image;
}
Ответ 4
Создайте MemoryStream из необработанных байтов и передайте это в свой конструктор Bitmap.
Вот так:
MemoryStream stream = new MemoryStream(bytes);
Bitmap image = new Bitmap(stream);