如何将byte []转换为BitmapImage?

时间:2013-03-07 12:07:49

标签: wpf image type-conversion bitmapimage

我有byte[]代表图像的原始数据。我想将其转换为BitmapImage

我尝试了几个我发现的例子,但我一直得到以下异常

  

“没有找到适合完成此操作的成像组件。”

我认为这是因为我的byte[]实际上并不代表图像,而只代表原始位。 所以我的问题如上所述是如何将原始位的byte []转换为BitmapImage

4 个答案:

答案 0 :(得分:11)

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;
    }
}

答案 1 :(得分:8)

当您的字节数组包含位图的原始像素数据时,您可以通过静态方法BitmapSource.Create创建BitmapSourceBitmapImage的基类)。

但是,您需要指定位图的一些参数。您必须事先知道宽度和高度以及缓冲区的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 :(得分:0)

我遇到了同样的错误,但这是因为我的数组没有充满实际数据。我有一个字节数组,它等于它应该的长度,但值仍然是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"];
}

我有多错!为了真正获得该blob中的实际字节,我需要实际将该结果读入OracleBlob对象。我没有填充数据集/数据表,而是这样做:

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;
}

答案 3 :(得分:-2)

从原始字节创建一个MemoryStream,并将其传递给Bitmap构造函数。

像这样:

MemoryStream stream = new     MemoryStream(bytes);
Bitmap image = new Bitmap(stream);