BMP RFC无法从标题信息中获取流大小但不能获取文件大小

时间:2013-03-23 16:14:12

标签: c# header format bmp rfc

尝试获取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:

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 个答案:

答案 0 :(得分:1)

BMP文件格式为二进制格式,这意味着您无法使用StreamReaderTextReader(仅使用 来阅读它>用于文本)或使用UTF-8或ANSI解码器解码。 (编码也仅用于 用于文本。)您必须使用BinaryReader来阅读。

文档说明:

  

偏移:0002h | 4个字节| BMP文件的大小(以字节为单位)

因此,您需要读取四个字节并将它们组合成一个整数值。

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

如果你这样做,你会看到:

921654

......这是900 KiB,然后是一些。