我有一个byte[]
代表图像的原始数据的。我想将其转换为BitmapImage
.
我尝试了几个我发现的例子,但我不断收到以下异常
“未找到适合完成此操作的成像组件。”
我认为这是因为 mybyte[]
实际上并不代表图像,而仅代表原始位。所以我的问题如上所述是如何将原始位的 byte[] 转换为BitmapImage
.
我有一个byte[]
代表图像的原始数据的。我想将其转换为BitmapImage
.
我尝试了几个我发现的例子,但我不断收到以下异常
“未找到适合完成此操作的成像组件。”
我认为这是因为 mybyte[]
实际上并不代表图像,而仅代表原始位。所以我的问题如上所述是如何将原始位的 byte[] 转换为BitmapImage
.
如问题中所述,下面的代码不会从原始像素缓冲区创建 BitmapSource 。
但是,如果您想从 PNG 或 JPEG 等编码帧创建 BitmapImage,您可以这样做:
public static BitmapImage LoadFromBytes(byte[] bytes)
{
using (var stream = new MemoryStream(bytes))
{
var image = new BitmapImage();
image.BeginInit();
image.CacheOption = BitmapCacheOption.OnLoad;
image.StreamSource = stream;
image.EndInit();
return image;
}
}
当您的字节数组包含位图的原始像素数据时,您可以通过静态方法创建一个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 stride = (width * pixelFormat.BitsPerPixel + 7) / 8;
var bitmap = BitmapSource.Create(width, height, dpiX, dpiY,
pixelFormat, null, buffer, stride);
我遇到了同样的错误,但这是因为我的数组没有被实际数据填充。我有一个字节数组,它等于它应该是的长度,但是这些值仍然是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;
}
从原始字节创建一个 MemoryStream 并将其传递给您的 Bitmap 构造函数。
像这样:
MemoryStream stream = new MemoryStream(bytes);
Bitmap image = new Bitmap(stream);