6

我正在创建一个包含任意值的字节数组,并希望将其转换为 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?

4

2 回答 2

9

给定一个字节数组,其中每个字节代表一个像素值,您可以创建如下所示的灰度位图。您需要指定位图的宽度和高度,这当然必须与缓冲区大小相匹配。

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并且当然还要传入适当的调色板。

于 2013-03-08T09:01:39.487 回答
1

字节数组必须包含有效的图像数据(PNG / JPG / BMP)。 如果您删除 using-block 并且数据有效,那么您的代码应该可以工作。BitmapImage 似乎不会立即加载图像,因此它无法在之后加载它,因为流已经被释放。

“任意值”是什么意思?随机 RGB 值?然后我建议使用Bitmap类并将生成的 Bitmap 保存在 Memorystream 中。

如果您只想将 Byte[] 绑定到用户界面中的图像控件:直接绑定到数组。它无需转换器即可工作。

于 2013-03-07T16:05:20.630 回答