Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “将位图保存到文件”在“图像大小”字段中为零_C#_.net_Bitmap_Gdi+_Bitmapdata - Fatal编程技术网

C# “将位图保存到文件”在“图像大小”字段中为零

C# “将位图保存到文件”在“图像大小”字段中为零,c#,.net,bitmap,gdi+,bitmapdata,C#,.net,Bitmap,Gdi+,Bitmapdata,使用格式为ImageFormat.Bmp的Bitmap.Save方法时,我发现文件中的位图头信息在biSizeImage字段中为零 据我所见,根据规格,这是可以的,但不幸的是,我被迫使用的蹩脚的嵌入式设备坚持正确设置 因此,问题是如何在保存位图时始终设置此标题信息字段 正如您所怀疑的,问题在于0是RGB位图的“图像大小”字段完全允许的值。BitMapInfo头文件的结构确认了这一事实: biSizeImage 图像的大小(以字节为单位)。对于BI_RGB位图,这可以设置为零 如果biCompre

使用格式为ImageFormat.Bmp的Bitmap.Save方法时,我发现文件中的位图头信息在biSizeImage字段中为零

据我所见,根据规格,这是可以的,但不幸的是,我被迫使用的蹩脚的嵌入式设备坚持正确设置


因此,问题是如何在保存位图时始终设置此标题信息字段

正如您所怀疑的,问题在于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框架正在以标准的、文档化的方式进行操作。如果你需要别的东西,你就得自己处理。