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

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

保存到流中时似乎缺少某种标题。为什么会这样,如何在不保存到文件的情况下轻松地将其添加到流中?

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

最佳答案

它们没有什么不同,但是当您转储,复制或对内存流执行其他操作时,始终必须将其重置为初始位置。

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位置放在图像数据的开头(在标头之后),假设这是您想要的。

关于c# - System.Drawing.Image数据在保存到文件和流之间是不同的,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44539790/

10-11 02:43