4

私は、非常に多くの場合、大きすぎてメモリに収まらない大きな bmp ファイルを処理する必要があるアプリケーションに取り組んでいます。プロジェクトの作成時に開発しているソフトウェアの一部として、私のアプリケーションはデータを bmp ファイルから別の形式に変換し、セクションで簡単に取得できるようにします。

現在、ファイルが大きすぎてメモリに収まらないことが多いため、ソフトウェアはバイト データのセクションをファイルから直接読み取り、処理して、次のセクションに移動します。ファイルを読み取るためのコードは、以下に示すものと似ています (わかりやすくするために簡略化しています)。

FileStream fs = File.OpenRead(fileName);
fs.Seek(sectionStart, SeekOrigin.Begin); 

currentSectionAsBytes = new byte[sectionSize];
fs.Read(currentSectionAsBytes, 0, currentSectionAsBytes.Length);

扱うファイルはすべて 4 で割り切れる幅を持っているため、bmp ファイルにはパディングがないため、これまでは問題なく機能していました。

最近、データの各行の最後にパディングがあるさまざまなサイズの画像を使用しており、取得したデータに誤りがありました。

私の質問は、ファイルから直接 bmp データを取得するより良い方法を知っている人はいますか? 前述のように、ファイル サイズが大きいため、ファイルからビットマップを読み取ることができません。現在、私の最善のアイデアは、 currentSectionAsBytes を取得した後、パディングサイズを計算して手動で削除することです。これはあまりにも面倒で複雑に思えます。より良い解決策があるはずです。

4

1 に答える 1

2

メモリ不足に直面している場合、配列から何かを「手動で削除する」ことは悪い考えです (別の配列を作成することになるため)。問題への正しいアプローチは、処理メソッドに2つの追加パラメーターを追加することだと思います。そのため、その署名は次のようになります。

void ProcessSection(byte[] data, int offset, int count);

そして、dataから0までdata.Lengthではなく、からoffsetまで繰り返しcountます。これは、.Net で配列を処理する一般的なfs.Read()方法です (たとえば、メソッドを参照してください)。他にできることはあまりありません。はい、ビットマップのプロパティに従ってオフセット/カウントを計算する必要があります。

または、代わりに、メソッドを呼び出すfs.Seekとき(たとえば、を計算するときsectionStart)にオフセットを考慮することができますが、最初のアプローチはより普遍的だと思います。

于 2013-07-30T10:58:53.853 に答える