System.Drawing.Image 保存到文件和流中的数据不同
System.Drawing.Image data is different between saving to a file and a stream
我有一张 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
保存到流时似乎缺少某种 header。为什么会这样,我怎样才能轻松地将它添加到我的流中而无需保存到文件?
我的问题不是如何执行此操作,而是为什么流不包含此内容 header 而文件包含此内容。
它们没有什么不同,但是当你转储或复制或对内存流做其他事情时,你总是必须将它重置到它的初始位置。
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 位置放在图像数据的开头(在 header 之后)。
我有一张 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
保存到流时似乎缺少某种 header。为什么会这样,我怎样才能轻松地将它添加到我的流中而无需保存到文件?
我的问题不是如何执行此操作,而是为什么流不包含此内容 header 而文件包含此内容。
它们没有什么不同,但是当你转储或复制或对内存流做其他事情时,你总是必须将它重置到它的初始位置。
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 位置放在图像数据的开头(在 header 之后)。