画像の生データをbyte[]
表す があります。に変換したいと思いBitmapImage
ます。
見つけたいくつかの例を試しましたが、次の例外が発生し続けました
「この操作を完了するのに適したイメージング コンポーネントが見つかりませんでした。」
byte[]
myは実際には Image ではなく生のビットのみを表しているためだと思います。だから私の質問は、上記のように、生のビットの byte[] を に変換する方法BitmapImage
です。
画像の生データをbyte[]
表す があります。に変換したいと思いBitmapImage
ます。
見つけたいくつかの例を試しましたが、次の例外が発生し続けました
「この操作を完了するのに適したイメージング コンポーネントが見つかりませんでした。」
byte[]
myは実際には Image ではなく生のビットのみを表しているためだと思います。だから私の質問は、上記のように、生のビットの 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"];
}
私はなんて間違っていたのでしょう。実際にそのブロブ内の実際のバイトを取得するには、その結果を実際に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);