首页 文章

byte []到ushort []

提问于
浏览
9

这是我的问题 . 请跟我说一点解释:

我正在读取tiff图像到缓冲区;我的tiff的每个像素由一个ushort(16位数据,非负数)表示 .

我的图像大小是64 * 64 = 4096.当我的tiff加载到缓冲区时,缓冲区长度因此是8192(两倍于4096) . 我想这是因为在我的缓冲区中,计算机使用2个字节来存储单个像素值 .

我想得到任何特定像素的值,在这种情况下,我应该将每2个字节组合为1个ushort吗?

例如:00000000 11111111 - > 0000000011111111?

这是我的代码:

public static void LoadTIFF(string fileName, int pxlIdx, ref int pxlValue)
        {
            using (Tiff image = Tiff.Open(fileName, "r"))
            {
                if (image == null)
                    return;

                FieldValue[] value = image.GetField(TiffTag.IMAGEWIDTH);
                int width = value[0].ToInt();

                byte[] buffer = new byte[image.StripSize()];
                for (int strip = 0; strip < image.NumberOfStrips(); strip++)
                    image.ReadEncodedStrip(strip, buffer, 0, -1);

                // do conversion here:
                //ushort bufferHex = BitConverter.ToUInt16(buffer, 0);            

                image.Close();

            }
        }

如何读取byte []缓冲区以确保我可以获得16位的ushort像素值?

谢谢

2 回答

  • 1

    由于每个像素都表示为16位,从编程角度来看,将 byte[] 表示为长度的一半的 ushort[] 可能更方便,但这不是必需的 .

    最佳解决方案取决于您希望如何使用缓冲区 .

    您可以轻松定义辅助方法

    ushort GetImageDataAtLocation(int x, int y) 
    { 
        offset = y * HEIGHT + x;
        return BitConverter.ToUInt16(buffer, offset);
    }
    

    使用输入坐标确定原始 byte[] 中的偏移量,并返回由适当字节组成的 ushort .

    如果TIFF存储数据big-endian并且您的系统是little-endian,则必须在转换之前反转字节的顺序 . 一种方法是:

    ushort GetImageDataAtLocation(int x, int y) 
    { 
        offset = y * HEIGHT + x;
        // Switch endianness e.g. TIFF is big-endian, host system is little-endian
        ushort result = ((ushort)buffer[0]) << 8 + buffer[1];
        return result;
    }
    

    如果您的代码可能在具有不同字节序的平台上运行(Intel和AMD都是little-endian),那么您可以使用运行时确定字节序

    BitConverter.IsLittleEndian

    有关BitConverter的详细信息,请参阅http://msdn.microsoft.com/en-us/library/system.bitconverter.touint16.aspx

  • 4

    你需要在一个循环中执行它: BitConverter.ToUInt16() 需要2个字节,将它们转换为一个ushort .

    警告:正如Eric指出的那样,它有字节序问题(它总是假定它正在执行的平台的字节顺序) . 仅当您确定在具有相同字节顺序的计算机上生成源字节流时才使用Bitconverter(如果是TIFF图像,您可能无法假设它) .

    您可以使用一些LINQ ...例如,有一个很好的 Chuncks 函数here . 您可以将它用作:

    rawBytes.Chunks(2).Select(b => BitConverter.ToUInt16(b)).toArray()
    

相关问题