0

试图获取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 

因此大小值包含在BMP4 字节区域的标头中( from [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 以获得以 Kbytes 为单位的大小,但再次......它没有等于901 Kb价值。

在此处输入图像描述

watch您可能会认为,当您查看对话框并将其与函数代码进行比较时,我混淆了该区域并选择了错误的值,但是正如您所见,函数中的 byte[] 数组是: headerPart,不是data,所以我没有混淆任何东西, data[] 是整个 BMP 文件的文件流。

那么,如何从 BMP 标头而不是 C# 中的流属性获取文件大小?

4

1 回答 1

1

BMP 文件格式是一种二进制格式,这意味着您无法使用StreamReaderor TextReader(两者都用于文本)读取它,也无法使用 UTF-8 或 ANSI 解码器对其进行解码。(编码也用于文本。)您必须使用BinaryReader.

该文档指出:

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

所以你需要读取四个字节并将它们组合成一个整数值。

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

如果你这样做,你会看到它显示:

921654

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

于 2013-03-23T16:22:02.457 回答