这是我的问题。请容忍我给出一点解释:
我正在将tiff图像读入缓冲区;tiff的每个像素都由一个ushort (16位数据,非负)表示。
我的图像大小是64*64 = 4096。因此,当我的tiff被加载到buffer中时,buffer的长度是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像素值?
谢谢
发布于 2013-02-13 23:34:43
由于每个像素被表示为16位,因此从编程的角度来看,将byte[]表示为长度的一半的ushort[]可能更方便,但这不是必需的。
最佳解决方案取决于您希望如何使用缓冲区。
您可以简单地定义一个帮助器方法
ushort GetImageDataAtLocation(int x, int y)
{
offset = y * HEIGHT + x;
return BitConverter.ToUInt16(buffer, offset);
}它使用输入坐标来确定原始byte[]中的偏移量,并返回由适当字节组成的ushort。
如果TIFF存储大端数据,而您的系统是小端数据,那么在转换之前必须颠倒字节的顺序。其中一种方法是:
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
发布于 2013-02-13 23:37:16
你需要在一个循环中完成:BitConverter.ToUInt16()需要2个字节,将它们转换成一个ushort。
警告:正如Eric所指出的,它存在字节顺序问题(它总是假定执行它的平台的字节顺序)。仅当您确定源字节流是在具有相同字节顺序的机器上生成时才使用Bitconverter (对于TIFF图像,您可能无法假定它)。
您可以使用一些LINQ...例如,有一个很好的Chuncks函数here。您可以将其用作:
rawBytes.Chunks(2).Select(b => BitConverter.ToUInt16(b)).toArray()https://stackoverflow.com/questions/14857044
复制相似问题