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バイト(から[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)。次に、それらを合計するのではなく、すべての値を1つの文字列行に書き込んでから、System.Int32に変換し、1024で除算してサイズをキロバイト単位で取得するだけだと思いましたが、そうではありません。値に等しい901 Kb

ここに画像の説明を入力してください

ダイアログを見て関数コードと比較すると、領域を混乱させて間違った値を選択したと思うかもしれませんがwatch、関数からのbyte []配列は:headerPart、ではないdataので、私はしませんでした何でも混乱させます、data[]はBMPファイル全体のファイルストリームです。

では、C#のストリームのプロパティからではなく、BMPヘッダーからファイルサイズを取得するにはどうすればよいですか?

4

1 に答える 1

1

BMPファイル形式はバイナリ形式ですStreamReader。つまり、またはTextReader(どちらもテキストにのみ使用されます)を使用して読み取ったり、UTF-8またはANSIデコーダーでデコードしたりすることはできません。(エンコーディングはテキストにものみ使用されます。)を使用して読み取る必要がありますBinaryReader

ドキュメントには次のように記載されています。

オフセット:0002h | 4バイト| BMPファイルのサイズ(バイト単位)

したがって、4バイトを読み取り、それらを整数値に結合する必要があります。

このBinaryReaderクラスを使用すると、ReadUInt32()メソッドを呼び出して、符号なし32ビット整数を形成する4バイトを読み取ることができます。

これを行うと、次のように表示されます。

921654

...これは900KiBで、それからいくつかです。

于 2013-03-23T16:22:02.457 に答える