私は画像の生データを表すbyte[]
を持っています。 BitmapImage
に変換したいと思います。 byte []をBitmapImageに変換するにはどうすればよいですか?
を取得保管「この操作を完了するのに適しませイメージングコンポーネントが見つかりませんでした。」
私のbyte[]
は実際にはイメージを表すのではなく、生のビットのみを表していると思います。 私の質問は上記のように生のビットのバイト[]をBitmapImage
に変換する方法です。
私は画像の生データを表すbyte[]
を持っています。 BitmapImage
に変換したいと思います。 byte []をBitmapImageに変換するにはどうすればよいですか?
を取得保管「この操作を完了するのに適しませイメージングコンポーネントが見つかりませんでした。」
私のbyte[]
は実際にはイメージを表すのではなく、生のビットのみを表していると思います。 私の質問は上記のように生のビットのバイト[]をBitmapImage
に変換する方法です。
あなたのバイト配列は、ビットマップの生のピクセルデータが含まれている場合、あなたは静的メソッドBitmapSource.Create
により(BitmapImage
の基底クラスである)BitmapSource
を作成することがあります。このよう
。
ただし、ビットマップのいくつかのパラメータを指定する必要があります。バッファの幅と高さ、そして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 bytesPerPixel = (pixelFormat.BitsPerPixel + 7)/8;
var stride = bytesPerPixel * width;
var bitmap = BitmapSource.Create(width, height, dpiX, dpiY,
pixelFormat, null, buffer, stride);
生のバイトからMemoryStreamを作成し、それをビットマップコンストラクタに渡します。
MemoryStream stream = new MemoryStream(bytes);
Bitmap image = new Bitmap(stream);
あなたは 'System.Drawing.Bitmap'を参照していますが、これはWPFではありません。 – Clemens
public static BitmapImage LoadFromBytes(byte[] bytes)
{
using (var stream = new MemoryStream(bytes))
{
stream.Seek(0, SeekOrigin.Begin);
var image = new BitmapImage();
image.BeginInit();
image.StreamSource = stream;
image.EndInit();
return image;
}
}
実際には、私はこれを試みましたが、私はこの質問のOPからの行を追加するまで動作しませんでした:http://stackoverflow.com/questions/35831893/bitmapimage-to-byte-and-reverse: 'image。 CreateOptions = BitmapCreateOptions.PreservePixelFormat; image.CacheOption = BitmapCacheOption.OnLoad; 'それ以外の場合は、空白の画像領域があります。 – vapcguy
私はこの同じエラーに遭遇しましたが、配列が実際のデータで満たされていなかったためです。私は、それが予定されていた長さに等しいバイトの配列を持っていたが、値はすべてまだ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"];
}
!そのBLOBの実際のバイトを実際に取得するには、その結果を実際に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;
}
を
Windows Phone 8では、BitmapSourceが作成オプションをサポートしていないため、上記は機能しません。あなたはどんな選択肢も知っていますか? – vishal
@vishal [WriteableBitmap](http://msdn.microsoft。com/ja-us/library/windows/apps/windows.ui.xaml.media.imaging.writeablebitmap.aspx)。 – Clemens
ありがとうございます。私はすでにこのオプションを試しています:http://stackoverflow.com/questions/17714662/convert-int-to-byte-type-pointer-in-c-sharp/17715106?noredirect=1#17715106 – vishal