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

标签 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

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

我的问题不是如何执行此操作,而是为什么流不包含此 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 位置放在图像数据的开头(在标题之后)。

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

相关文章:

c# - 将 Xamarin Forms 中的 DateTime 格式化为设备格式字符串

swift - 如何在 Live Activity (ActivityKit) 中获取图像 - SwiftUI

html - 在页脚中排列图片

python 3.3 : Unable to load an image using Pygame if game folder is not in C drive

c# - EMGU CV 视频作者无法制作视频

android - 加载大图像

apache-flex - 如何设置 s :BitmapFill dynamically? 的来源(Flash Builder,内部代码)

c# - WCF - 无法获取元数据

c# - 在 Windows 8.1 应用程序中使用使用 Visual C++ 2012 构建的 Windows 8.0 扩展 SDK 组件

c# - PInvoke 和德尔福