2013-03-23 27 views
0

试图获得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:

enter image description here

但是,我从代码有:84

我检查了正确的区域,我认为我可以得到不正确的值,但我已经正确地得到它(从BMP的byte []数据从第2到第5)。 2)。然后我想,我不能总结它们,而只是在一个字符串行写所有的值,然后将其转换为System.Int32并在1024上分割以获得以KB为单位的大小,但是再次...它不等于901 Kb的值。

enter image description here

您可能会想,我已经糊涂了区域并选择错误的价值观,当你看着watch对话,并将其与功能代码的比较,但是当你看到从功能byte []数组是:headerPart,而不是data,所以我没有混淆任何东西,data []是整个BMP文件的文件流。

那么,我怎样才能从BMP头,而不是从C#中的流属性获取文件大小?

回答

1

的BMP文件格式是一种二进制格式,这意味着使用不能读取它StreamReaderTextReader(这两者都是使用用于文本),或者它与UTF-8或ANSI解码器进行解码。 (对于文本,编码也仅用于)。您必须使用BinaryReader来阅读它。

的文档状态:

偏移:0002H | 4个字节| BMP文件的字节

大小所以你需要阅读字节,将它们组合成一个整数值。

对于BinaryReader类,您可以调用ReadUInt32() method来读取形成无符号32位整数的4个字节。

如果你这样做,你会看到有这么一句话:

921654 

...这是900昆明植物研究所,然后一些。

+0

不明白为什么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

+0

@OlegOrlov如果你在文本编辑器中打开一个.bmp文件,它看起来像文本还是看起来像随机垃圾?它看起来像垃圾,这意味着它是一个_binary_文件,而不是一个文本文件_。你不能用'StreamReader'或'TextReader'读取二进制文件,它不使用编码。你必须使用'BinaryReader'来代替,如果这会让你感到困惑,就不要忘记移位。 – Virtlink 2013-03-23 16:30:52

+0

我明白了,但是为什么在字节移位时,为什么要使用从0到24的精确移位,而不是从24到48?我对这样的移位操作数感到困惑,因为你所移动的值不是从文件开始,所以你为什么开始从'<< 8'转换,那里的值不是起始值?谢谢! – Secret 2013-03-23 16:37:11