2013-03-07 16 views
12

私は画像の生データを表すbyte[]を持っています。 BitmapImageに変換したいと思います。 byte []をBitmapImageに変換するにはどうすればよいですか?

は、私は私が見つけたいくつかの例を試してみましたが、私は次の例外

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

私のbyte[]は実際にはイメージを表すのではなく、生のビットのみを表していると思います。 私の質問は上記のように生のビットのバイト[]をBitmapImageに変換する方法です。

答えて

8

あなたのバイト配列は、ビットマップの生のピクセルデータが含まれている場合、あなたは静的メソッド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); 
+0

Windows Phone 8では、BitmapSourceが作成オプションをサポートしていないため、上記は機能しません。あなたはどんな選択肢も知っていますか? – vishal

+1

@vishal [WriteableBitmap](http://msdn.microsoft。com/ja-us/library/windows/apps/windows.ui.xaml.media.imaging.writeablebitmap.aspx)。 – Clemens

+0

ありがとうございます。私はすでにこのオプションを試しています:http://stackoverflow.com/questions/17714662/convert-int-to-byte-type-pointer-in-c-sharp/17715106?noredirect=1#17715106 – vishal

-1

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

MemoryStream stream = new  MemoryStream(bytes); 
Bitmap image = new Bitmap(stream); 
+0

あなたは 'System.Drawing.Bitmap'を参照していますが、これはWPFではありません。 – Clemens

11
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; 
    } 
} 
+0

実際には、私はこれを試みましたが、私はこの質問のOPからの行を追加するまで動作しませんでした:http://stackoverflow.com/questions/35831893/bitmapimage-to-byte-and-reverse: 'image。 CreateOptions = BitmapCreateOptions.PreservePixelFormat; image.CacheOption = BitmapCacheOption.OnLoad; 'それ以外の場合は、空白の画像領域があります。 – vapcguy

0

私はこの同じエラーに遭遇しましたが、配列が実際のデータで満たされていなかったためです。私は、それが予定されていた長さに等しいバイトの配列を持っていたが、値はすべてまだ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; 
} 
関連する問題