我正在创建一个包含任意值的字节数组,并希望将其转换为BitmapImage。
bi = new BitmapImage();
using (MemoryStream stream = new MemoryStream(data))
{
try
{
bi.BeginInit();
bi.CacheOption = BitmapCacheOption.OnLoad;
bi.StreamSource = stream;
bi.DecodePixelWidth = width;
bi.EndInit();
}
catch (Exception ex)
{
return null;
}
}
这段代码一直给我一个NotSupportedException。 我怎么能从任何字节数组创建一个BitmapSource?
答案 0 :(得分:7)
给定一个字节数组,其中每个字节表示一个像素值,您可以创建一个灰度位图,如下所示。您需要指定位图的宽度和高度,当然必须与缓冲区大小匹配。
byte[] buffer = ... // must be at least 10000 bytes long in this example
var width = 100; // for example
var height = 100; // for example
var dpiX = 96d;
var dpiY = 96d;
var pixelFormat = PixelFormats.Gray8; // grayscale bitmap
var bytesPerPixel = (pixelFormat.BitsPerPixel + 7) / 8; // == 1 in this example
var stride = bytesPerPixel * width; // == width in this example
var bitmap = BitmapSource.Create(width, height, dpiX, dpiY,
pixelFormat, null, buffer, stride);
每个字节值也可以表示调色板的索引,在这种情况下,您必须指定PixelFormats.Indexed8
,当然还要传递适当的调色板。
答案 1 :(得分:1)
字节数组必须包含有效的图像数据(PNG / JPG / BMP)。
如果删除使用块并且数据有效,那么您的代码应该可以正常工作。 BitmapImage似乎不会立即加载图像,因此它之后无法加载它,因为流已经被处理掉了。
“任意值”是什么意思?随机RGB值?然后我建议使用Bitmap类并将结果位图保存在Memorystream中。
如果您只想在用户界面中绑定Byte []和Image Control:直接绑定到数组。它没有转换器。