C# “将位图保存到文件”在“图像大小”字段中为零
使用格式为ImageFormat.Bmp的Bitmap.Save方法时,我发现文件中的位图头信息在biSizeImage字段中为零 据我所见,根据规格,这是可以的,但不幸的是,我被迫使用的蹩脚的嵌入式设备坚持正确设置C# “将位图保存到文件”在“图像大小”字段中为零,c#,.net,bitmap,gdi+,bitmapdata,C#,.net,Bitmap,Gdi+,Bitmapdata,使用格式为ImageFormat.Bmp的Bitmap.Save方法时,我发现文件中的位图头信息在biSizeImage字段中为零 据我所见,根据规格,这是可以的,但不幸的是,我被迫使用的蹩脚的嵌入式设备坚持正确设置 因此,问题是如何在保存位图时始终设置此标题信息字段 正如您所怀疑的,问题在于0是RGB位图的“图像大小”字段完全允许的值。BitMapInfo头文件的结构确认了这一事实: biSizeImage 图像的大小(以字节为单位)。对于BI_RGB位图,这可以设置为零 如果biCompre
因此,问题是如何在保存位图时始终设置此标题信息字段 正如您所怀疑的,问题在于0是RGB位图的“图像大小”字段完全允许的值。
BitMapInfo头文件的结构确认了这一事实:
biSizeImage
图像的大小(以字节为单位)。对于BI_RGB
位图,这可以设置为零
如果biCompression
是biu-JPEG
或biu-PNG
,biSizeImage
分别指示JPEG或PNG图像缓冲区的大小
因此,在.NET框架中的实现只是以标准的、文档化的方式进行操作。由于需要其他内容,您必须自己处理保存到文件的过程,这将允许您手动修改BitMapInfo头
结构的biSizeImage
成员
这里有一个非常全面的示例:。当然,它是为紧凑型框架编写的,但大多数单个组件仍然适用。您需要从Windows API中P/调用多个函数(访问以获取定义),并使用DC
将绘图交到自己手中可能也会更快,因为您使用的是GDI子系统,而不是GDI+。这里有一篇关于这种通用方法的文章:,它似乎也演示了如何使用bitmapinfo-header
struct处理问题
如果你理解非托管C++代码,这里有一个教程,它可以让你了解在C中实现同样的事情:正如您所看到的,所需的代码确实没有那么长,尽管仍然不止一行
位图.Save
方法。我也遇到了这个问题,并用一个简单的技巧解决了这个问题。
保存位图,然后将其作为文件流打开,并手动更改biSizeimage
字段
picbpp.Save("pic.bmp", ImageFormat.Bmp);
string path = "pic.bmp";
FileStream fs = File.Open(path, FileMode.Open, FileAccess.Write, FileShare.None);
// Change biSizeimage field manually.
Byte[] info = new byte[] {0x10,0x59};
fs.Seek(34, SeekOrigin.Begin);
fs.Write(info, 0, info.Length);
fs.Close();
好的,谢谢,我本想避开品沃克,但这似乎是唯一的办法。@user380689:我不知道还有别的办法。我认为问题在于,正如您所指出的,0是biSaveImage
成员的期望值。bitmapinfo头的结构确认了这一点:“对于BI_RGB位图,这可能被设置为零。”事实上,常量BI_RGB
的值为0。NET框架正在以标准的、文档化的方式进行操作。如果你需要别的东西,你就得自己处理。