System.Drawing.Image数据在保存到文件和流之间是不同的

时间:2017-06-14 08:45:03

标签: c# image bitmap save bmp

我有一个png格式的图像,我想加载并转换为bmp流。我用来实现此目的的代码如下:

        // 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/p1TBjnD1

然而,这产生的流与保存到文件并打开它时不同:

        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);

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

保存到流时似乎缺少某种标头。为什么会这样,如何轻松地将其添加到我的流中而无需保存到文件?

我的问题不是如何执行此操作,而是在文件执行时为什么流不包含此标头。

1 个答案:

答案 0 :(得分: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位置放在图像数据的开头(在标题之后),假设这是你想要的。