10

これが私の質問です。少し説明してください。

tiff画像をバッファに読み込んでいます。私のtiffの各ピクセルは、ushort(16ビットデータ、非負)で表されます。

私の画像サイズは64*64 = 4096です。tiffがバッファにロードされると、バッファの長さは8192(4096の2倍)になります。これは、私のバッファーでは、コンピューターが2バイトを使用して1つのピクセル値を格納しているためだと思います。

特定のピクセルの値を取得したいのですが、この場合、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ピクセル値を確実に取得できるようにするにはどうすればよいですか?

ありがとう

4

2 に答える 2

5

各ピクセルは16ビットで表されるため、プログラミングの観点からは、を半分の長さで表す方が便利な場合がありますが、必須ではありません。byte[]ushort[]

最善の解決策は、バッファをどのように消費するかによって異なります。

ヘルパーメソッドを同じように簡単に定義できます

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

これは、入力座標を使用して元のオフセットを決定し、適切なバイトで構成されたものbyte[]を返します。ushort

TIFFがデータをビッグエンディアンで保存し、システムがリトルエンディアンである場合、変換前にバイトの順序を逆にする必要があります。そのための1つの方法は次のとおりです。

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-13T15:34:42.793 に答える
1

ループで実行する必要がありBitConverter.ToUInt16()ます。2 バイトを取り、それらを 1 つの ushort に変換します。

警告: Eric が指摘したように、エンディアンの問題があります (実行しているプラ​​ットフォームのエンディアンを常に想定しています)。Bitconverter は、ソース バイト ストリームが同じエンディアンのマシンで生成されていることが確実な場合にのみ使用してください (TIFF 画像の場合、おそらくそれを想定することはできません)。

LINQ を使用することもできます...たとえば、ここChuncksに便利な機能があります。次のように使用できます。

rawBytes.Chunks(2).Select(b => BitConverter.ToUInt16(b)).toArray()
于 2013-02-13T15:37:15.913 に答える