这是我的问题 . 请跟我说一点解释:
我正在读取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 回答
由于每个像素都表示为16位,从编程角度来看,将
byte[]
表示为长度的一半的ushort[]
可能更方便,但这不是必需的 .最佳解决方案取决于您希望如何使用缓冲区 .
您可以轻松定义辅助方法
使用输入坐标确定原始
byte[]
中的偏移量,并返回由适当字节组成的ushort
.如果TIFF存储数据big-endian并且您的系统是little-endian,则必须在转换之前反转字节的顺序 . 一种方法是:
如果您的代码可能在具有不同字节序的平台上运行(Intel和AMD都是little-endian),那么您可以使用运行时确定字节序
BitConverter.IsLittleEndian
有关BitConverter的详细信息,请参阅http://msdn.microsoft.com/en-us/library/system.bitconverter.touint16.aspx
你需要在一个循环中执行它:
BitConverter.ToUInt16()
需要2个字节,将它们转换为一个ushort .警告:正如Eric指出的那样,它有字节序问题(它总是假定它正在执行的平台的字节顺序) . 仅当您确定在具有相同字节顺序的计算机上生成源字节流时才使用Bitconverter(如果是TIFF图像,您可能无法假设它) .
您可以使用一些LINQ ...例如,有一个很好的
Chuncks
函数here . 您可以将它用作: