1

画像処理を行うプログラムを書いています。生のバイナリ ファイルを扱っており、生のファイルから 16 ビット バッファにデータを書き込む必要があります。私はほとんどそれを手に入れましたが、変換を行う方法がよくわかりません。これまでの私のコードは次のとおりです。

        Int16[] pixelBuffer;
        String inFile;
        String outFile;        

        /// Constructor. Allocates space for 3032x2016 16-bit values.
        /// <param name="inputFile">Name of the binary input file to be read.</param>
        /// <param name="outputFile">Name of the binary output file to be written.</param>
        public ColorCorrector(String inputFile, String outputFile)
        {
        this.inFile = inputFile;
        this.outFile = outputFile;
        this.pixelBuffer = new Int16[6112512];
        //I need to open the binary file 'inputFile' and store 16-bit values in pixelBuffer.

    }

どんな助けでも大歓迎です!

4

4 に答える 4

2
using (var inputStream = File.Open(inputFile))      
using (var reader = new BinaryReader(inputStream))      
{           
    int index = 0;
    while (inputStream.Position < inputStream.Length)
        pixelBuffer[index++] = reader.ReadInt16();      
}
于 2012-06-13T21:22:21.407 に答える
1

最高のパフォーマンスが必要な場合は、FileStream クラスを使用して固定サイズのbyte[]バッファー (おそらく 64KB) に読み込むことをお勧めします。

アンセーフ コードを使用して各バッファをInt16[]. コピーには数行しかかからず、シフトやキャストなどが必要ないため高速です。これは単なるタイトなコピー ループです。

BinaryReader は 10 倍程度遅いと思います。最新の CPU は分岐のないタイトなループを好みますが、BinaryReader はそれを提供できません。

于 2012-06-13T21:22:43.347 に答える
1

すべてインメモリが必要な場合は、生のbyte[]バッファを使用することもできます。あなたはそれが実際に/経由であるふりをすることができます:shortushortunsafe

 byte[] raw = File.ReadAllBytes(inputPath);
 unsafe
 {
     fixed(byte* ptr = raw)
     {
         ushort* pixels = (ushort*)ptr;
         pixels[0] = 0; // <=== your changes, etc
     }
 }
 File.WriteAllBytes(outputPath, raw);

注:ファイルのエンディアンを確認する必要がある場合があります。MSB が設定された値に対して「シフト」操作を使用している人々の驚きが少ないushortため、上記に進みました。それが実際に数値ushortを表していない場合(ただし、単なるデータである場合)、通常は符号なしと考える方が簡単です。

于 2012-06-13T21:25:44.357 に答える
0

と を参照する必要があります。これらはおそらく探してSystem.IO.BinaryReaderいるSystem.Drawing.Bitmapものです。

aBinaryReaderから aFileStreamを作成し、メソッドを使用ReadInt16()してストリームから 16 ビット整数を読み取ることができます。

于 2012-06-13T21:16:10.723 に答える