我有一个要加载并转换为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/