首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >byte[]到ushort[]

byte[]到ushort[]
EN

Stack Overflow用户
提问于 2013-02-13 23:30:54
回答 2查看 8.1K关注 0票数 10

这是我的问题。请容忍我给出一点解释:

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

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

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

例如: 00000000 11111111 -> 0000000011111111?

下面是我的代码:

代码语言:javascript
复制
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像素值?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-13 23:34:43

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

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

您可以简单地定义一个帮助器方法

代码语言:javascript
复制
ushort GetImageDataAtLocation(int x, int y) 
{ 
    offset = y * HEIGHT + x;
    return BitConverter.ToUInt16(buffer, offset);
}

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

如果TIFF存储大端数据,而您的系统是小端数据,那么在转换之前必须颠倒字节的顺序。其中一种方法是:

代码语言:javascript
复制
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都采用小字节顺序),则可以在运行时使用以下命令确定字节顺序

BitConverter.IsLittleEndian

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

票数 5
EN

Stack Overflow用户

发布于 2013-02-13 23:37:16

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

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

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

代码语言:javascript
复制
rawBytes.Chunks(2).Select(b => BitConverter.ToUInt16(b)).toArray()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14857044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档