2017-06-14 2 views
2

私はロードしてbmpストリームに変換したい画像をpng形式で持っています。これが生成するストリームをファイルに保存し、このようにそれを開くときに異なっているがhttps://pastebin.com/raw/p1TBjnD1System.Drawing.Imageデータは、ファイルとストリームに保存するときに異なります

 FileStream originalFile = File.Open("image.png", FileMode.Open); 
     System.Drawing.Image fileImage = System.Drawing.Image.FromStream(originalFile); 

     FileStream bmpStream; 
     fileImage.Save("image.bmp", System.Drawing.Imaging.ImageFormat.Bmp); 
     bmpStream = File.Open("image.bmp", FileMode.Open); 

 // Image.FromFile yields the same result. 
     FileStream originalFile = File.Open("image.png", FileMode.Open); 
     System.Drawing.Image fileImage = System.Drawing.Image.FromStream(originalFile); 

     MemoryStream bmpStream = new MemoryStream(); 
     fileImage.Save(bmpStream, System.Drawing.Imaging.ImageFormat.Bmp); 

結果:私はこれを達成するために使用しているコードは以下のとおりです。

結果:https://pastebin.com/raw/vSdRwZpL

ストリームに保存するときにヘッダーが欠落しているようです。これはなぜですか、ファイルに保存しなくても簡単にストリームに追加できますか?

私の質問はこれを行う方法ではなく、ストリームがこのヘッダーをファイル内に含んでいない理由です。

+0

[System.Drawing.Image to stream C#]の可能な複製(https://stackoverflow.com/questions/1668469/system-drawing-image-to-stream-c-sharp) –

+1

私はそうは思わないこれはどうして出力が違うのかということに関する質問です。 – Cryru

+1

オリジナルのPNGをどこかにアップロードして、同じデータセットで自分自身をテストできますか? –

答えて

1

これらは違いはありませんが、メモリストリームでダンプやコピーなどを行う場合は、必ず最初の位置にリセットする必要があります。

fileImage.Save(bmpStream, System.Drawing.Imaging.ImageFormat.Bmp);   
bmpStream.Position = 0 
... now you can dump or save to file from bmpStream 

位置をリセットしないと、MemoryStreamから何も読み取られないことがあります。 Image.Save()の場合、SaveメソッドはMemoryStreamの位置をイメージデータの先頭(ヘッダーの後ろ)に置き、これが必要であると仮定しているため、さらに複雑です。

関連する問題