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 に答える