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

如果您想获得最佳性能,我建议您byte[]使用 FileStream 类读入一个固定大小的缓冲区(可能为 64KB)。

您可以使用不安全代码将每个缓冲区复制到您的Int16[]. 复制只需要几行代码,而且速度很快,因为不需要换班和演员等。这只是一个紧密的复制循环。

我估计 BinaryReader 慢了 10 倍左右。现代 CPU 喜欢没有分支的紧密循环,而 BinaryReader 无法提供。

于 2012-06-13T21:22:43.347 回答
1

如果您需要全部在内存中,您不妨使用原始byte[]缓冲区。你可以假装那实际上是short/ ushortvia unsafe

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

注意:您可能需要检查文件的字节顺序。我已经ushort在上面进行了介绍,因为ushort对于使用 MSB 集的值使用“移位”操作的人来说,不会有那么大的惊喜。如果它实际上并不代表一个数字(而只是:数据),通常更容易将其视为无符号数。

于 2012-06-13T21:25:44.357 回答
0

你应该看看System.IO.BinaryReaderSystem.Drawing.Bitmap那些可能是你正在寻找的。

您可以BinaryReader从 a 中创建 aFileStream并使用该ReadInt16()方法从流中读取 16 位整数。

于 2012-06-13T21:16:10.723 回答