试图获得BMP
文件的有效大小。BMP RFC不能从流大小获取文件的大小但是从头信息
当然,最好的方法是获取加载流的Length
属性。
但是BMP
头格式DOES包含了它的大小信息,我想试着从BMP头中得到它。
如从维基或其它来源:
http://en.wikipedia.org/wiki/BMP_file_format
offset: 0002h | 4 bytes | the size of the BMP file in bytes
所以大小值包括在中的4个字节(从[2] -> [5]: 2, 3, 4, 5
)
区域BMP
头所以首先我的认为获得所有字节值并总和:
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#中的流属性获取文件大小?
不明白为什么little-endian在这里,不能BMP文件成为UTF-8或ANSI?我已经得到了文件的编码:'使用(var fileStreamReader = new StreamReader(fileName,true)){fileEncoding = fileStreamReader.CurrentEncoding; }'它显示了我的文件的准确性,我在UTF-8编码中完全描述了这里,而不是Little-Endian。我不明白,为什么你会用'[3],[4],[5]'的字节移位,请你帮我一下,谢谢! – Secret 2013-03-23 16:28:23
@OlegOrlov如果你在文本编辑器中打开一个.bmp文件,它看起来像文本还是看起来像随机垃圾?它看起来像垃圾,这意味着它是一个_binary_文件,而不是一个文本文件_。你不能用'StreamReader'或'TextReader'读取二进制文件,它不使用编码。你必须使用'BinaryReader'来代替,如果这会让你感到困惑,就不要忘记移位。 – Virtlink 2013-03-23 16:30:52
我明白了,但是为什么在字节移位时,为什么要使用从0到24的精确移位,而不是从24到48?我对这样的移位操作数感到困惑,因为你所移动的值不是从文件开始,所以你为什么开始从'<< 8'转换,那里的值不是起始值?谢谢! – Secret 2013-03-23 16:37:11