Подтвердить что ты не робот

Как преобразовать байт [] в BitmapImage?

У меня есть byte[], который представляет необработанные данные изображения. Я хотел бы преобразовать его в BitmapImage.

Я попробовал несколько примеров, которые я нашел, но я продолжал получать следующее исключение.

"Никакой компонент изображения, подходящий для завершения этой операции, не найден".

Я думаю, что это потому, что мой byte[] фактически не представляет изображение, а только сырые биты. поэтому мой вопрос, как упоминалось выше, заключается в том, как преобразовать байт [] исходных бит в BitmapImage.

4b9b3361

Ответ 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);