byte [] zu ushort []

9

Hier ist meine Frage. Trage mit mir eine kleine Erklärung:

Ich lese tiff Bild in den Puffer; Jedes Pixel meines Tiffs wird durch eine Ushort dargestellt (16 Bit Daten, nicht-negativ).

Meine Bildgröße ist 64 * 64 = 4096. Wenn mein TIFF in den Puffer geladen wird, ist die Pufferlänge daher 8192 (doppelt so viel wie 4096). Ich denke, das liegt daran, dass der Computer in meinem Puffer 2 Byte zum Speichern eines einzelnen Pixelwerts verwendet.

Ich möchte den Wert für ein bestimmtes Pixel erhalten, in diesem Fall sollte ich alle 2 Bytes zu 1 ushort kombinieren?

Zum Beispiel: 00000000 11111111 - & gt; 0000000011111111?

Hier ist mein Code:

%Vor%

Wie lese ich den Byte [] -Puffer, um sicherzustellen, dass ich den 16-Bit-Pixel-Wert erhalten kann?

Danke

    
Nick Tsui 13.02.2013, 15:30
quelle

2 Antworten

4

Da jedes Pixel als 16 Bit dargestellt wird, kann es aus einer Programmierperspektive bequemer sein, um das byte[] als ushort[] der halben Länge darzustellen, aber es ist nicht erforderlich.

Die beste Lösung hängt davon ab, wie Sie den Puffer verbrauchen möchten.

Sie könnten ebenso einfach eine Hilfsmethode definieren

%Vor%

verwendet die Eingabekoordinaten, um den Versatz im ursprünglichen byte[] zu ermitteln, und gibt ein ushort aus den entsprechenden Bytes zurück.

Wenn das TIFF-Daten Big-Endian speichert und Ihr System Little-Endian ist, müssten Sie die Reihenfolge der Bytes vor der Konvertierung umkehren. Ein Weg, dies zu tun ist:

%Vor%

Wenn Ihr Code jemals auf Plattformen mit unterschiedlicher Endianz ausgeführt wird (Intel und AMD sind beide Little Endian), können Sie die Endianess zur Laufzeit mit

bestimmen

BitConverter.IsLittleEndian

Weitere Informationen zum BitConverter finden Sie unter Ссылка

    
Eric J. 13.02.2013, 15:34
quelle
1

Sie müssen es in einer Schleife tun: BitConverter.ToUInt16() benötigt 2 Bytes, konvertiert sie in eine einzige Zeile.

WARNUNG: wie Eric darauf hingewiesen hat, hat es Endian-Probleme (es nimmt immer die Endlichkeit der Plattform an, auf der es ausgeführt wird). Verwenden Sie Bitconverter nur, wenn Sie sicher sind, dass der Quellbyte-Stream auf einer Maschine mit der gleichen Endianität erzeugt wird (im Fall von TIFF-Bildern können Sie dies wahrscheinlich nicht annehmen).

Sie können einige LINQ verwenden ... zum Beispiel gibt es eine nette Chuncks Funktion hier . Sie können es als:

verwenden %Vor%     
Lorenzo Dematté 13.02.2013 15:37
quelle