2016-10-19 17 views
0

今、jpg ImageからImage Classを取得しようとしています。 既にBitmapSourceをhereにリンクして使用しようとしました。jpg ImageのMemoryStreamからImageクラスを取得するにはどうすればよいですか?

エラーは英語ではありませんが、意味は「イメージヘッダーが壊れていますので、デコードできません。」です。 gif、png、bmpのような他のフォーマットは問題ありません。 jpg形式のみがこの問題に直面しています。

<シーケンス> Zipアーカイブファイル(JPGファイルは、このファイルにあります。) - >解凍ライブラリ - >のMemoryStream(JPGファイル) - >たBitmapSource

imageSource.BeginInit(); 
imageSource.StreamSource = memoryStream; 
imageSource.EndInit(); 

このコードはエラーになります。

私は理由がメモリストリームはjpgの生のバイナリを持っていると思うし、それはビットマップ形式ではありません。したがって、BitmapSourceはこのメモリストリームデータをビットマップイメージとして認識できません。

どうすればこの問題を解決できますか? 私の目標は、入力: "ZIPファイル(jpg)" - >出力:画像クラスです。

ありがとうございました!

<マイコード>

using (MemoryStream _reader = new MemoryStream()) 
{ 
    reader.WriteEntryTo(_reader);    // <- input jpg_data to _reader 
    var bitmap = new BitmapImage(); 
    bitmap.BeginInit(); 
    bitmap.CacheOption = BitmapCacheOption.OnLoad; 
    bitmap.StreamSource = _reader; 
    bitmap.EndInit(); 
    bitmap.Freeze(); 

    Image tmpImg = new Image(); 
    tmpImg.Source = bitmap; 
} 
+0

のBitmapImageできるコースのJPGバッファーをデコードします。おそらく、あなたはどこかでストリームを巻き戻すことを忘れていました。 'stream.Position = 0;'あなたのコードをもっと見せてください。 – Clemens

+0

ありがとう!私は自分のコードを添付しました。 –

答えて

0

書き込み後のストリームを巻き戻します。明らかにJpegBitmapDecoderはソースストリームのPositionの影響を受けますが、一般的にはすべての種類のビットマップストリームに対してこれを行う必要があります。

var bitmap = new BitmapImage(); 

using (var stream = new MemoryStream()) 
{ 
    reader.WriteEntryTo(stream); 
    stream.Position = 0; // here 

    bitmap.BeginInit(); 
    bitmap.CacheOption = BitmapCacheOption.OnLoad; 
    bitmap.StreamSource = stream; 
    bitmap.EndInit(); 
    bitmap.Freeze(); 
} 

var tmpImg = new Image { Source = bitmap }; 

そして、あなたが実際にあなたのイメージのソースがBitmapImageBitmapFrameであるかどうかを気にしないでください念のために、あなたはこれにあなたのコードを減らすことがあります。

BitmapSource bitmap; 

using (var stream = new MemoryStream()) 
{ 
    reader.WriteEntryTo(stream); 
    stream.Position = 0; 
    bitmap = BitmapFrame.Create(stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad); 
} 

var tmpImg = new Image { Source = bitmap }; 
+0

ありがとう! これはうまくいきます。私はストリームを巻き戻す必要があることを知っていない。 また、追加されたコードはawsomeです! –

関連する問題