12

画像の生データをbyte[]表す があります。に変換したいと思いBitmapImageます。

見つけたいくつかの例を試しましたが、次の例外が発生し続けました

「この操作を完了するのに適したイメージング コンポーネントが見つかりませんでした。」

byte[]myは実際には Image ではなく生のビットのみを表しているためだと思います。だから私の質問は、上記のように、生のビットの byte[] を に変換する方法BitmapImageです。

4

4 に答える 4

11

以下のコードは、質問で尋ねられたように、生のピクセル バッファから 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;
    }
}
于 2013-03-07T12:53:49.593 に答える
9

バイト配列にビットマップの生のピクセル データが含まれている場合、静的メソッド によってBitmapSource(の基本クラスである) を作成できます。BitmapImageBitmapSource.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);
于 2013-03-07T13:31:42.333 に答える
-1

これと同じエラーに遭遇しましたが、それは配列が実際のデータで満たされていなかったためです。本来の長さに等しいバイト配列がありましたが、値はすべてまだ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"];
}

私はなんて間違っていたのでしょう。実際にそのブロブ内の実際のバイトを取得するには、その結果を実際に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;
}
于 2016-10-12T01:25:04.360 に答える
-3

生のバイトから MemoryStream を作成し、それを Bitmap コンストラクターに渡します。

このような:

MemoryStream stream = new     MemoryStream(bytes);
Bitmap image = new Bitmap(stream);
于 2013-03-07T12:13:01.977 に答える