尝试获取BMP
文件的有效大小。
当然,最好的方法是获取加载流的Length
属性。
但BMP
标题格式包括有关其大小的信息,我想尝试从BMP标题中获取它。
来自Wiki或其他来源:
http://en.wikipedia.org/wiki/BMP_file_format
offset: 0002h | 4 bytes | the size of the BMP file in bytes
因此,大小值包含在BMP
标头中,区域为4个字节(来自[2] -> [5]: 2, 3, 4, 5
)
首先,我想要获取所有字节值并总结所有:
1)。
int BMPGetFileSize(ref byte[] headerPart)
{
int fileSize = 0;
for (int i = 0; i < headerPart.Length; i++)
{
fileSize += headerPart[i];
}
return (fileSize > 0) ? fileSize : -1;
}
我的尺寸很小......对于我的文件,实际尺寸是901:
但是,我从代码中得到了:84。
我已经检查了正确的区域,我认为我可能得不到正确的值,但我得到了正确的(从BMP的byte []数据的第2到第5)。
2)。然后我想,我不能总结它们,而只是在一个字符串行写入所有值,然后将其转换为System.Int32并除以1024以获得以KB为单位的大小,但是再次......它不会等于901 Kb
值。
您可能认为,当您查看watch
对话框并将其与功能代码进行比较时,我已经混淆了区域并选择了错误的值,但正如您所看到的,函数中的byte []数组是: headerPart
,而不是data
,所以我没有混淆任何东西,data []是整个BMP文件的文件流。
那么,我如何从BMP头获取文件大小,而不是从C#中的流属性获取文件大小?
答案 0 :(得分:1)
BMP文件格式为二进制格式,这意味着您无法使用StreamReader
或TextReader
(仅使用 来阅读它>用于文本)或使用UTF-8或ANSI解码器解码。 (编码也仅用于 用于文本。)您必须使用BinaryReader
来阅读。
文档说明:
偏移:0002h | 4个字节| BMP文件的大小(以字节为单位)
因此,您需要读取四个字节并将它们组合成一个整数值。
使用BinaryReader
类,您可以调用ReadUInt32()
method来读取形成无符号32位整数的4个字节。
如果你这样做,你会看到:
921654
......这是900 KiB,然后是一些。