gpt4 book ai didi

c# - byte[] 到 ushort[]

转载 作者:可可西里 更新时间:2023-11-01 09:11:56 28 4
gpt4 key购买 nike

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

我正在将 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 像素值?

谢谢

最佳答案

由于每个像素都表示为 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

关于c# - byte[] 到 ushort[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14857044/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com