Wie packst du ARGB einmalig in eine ganze Zahl?

9

Ich habe vier ganzzahlige Werte (0 - 255) für eine ARGB-Farbkarte.

Nun möchte ich einen eindeutigen float oder eine ganze Zahl dieser vier ganzen Zahlen machen. Ist es möglich wie folgt?

%Vor%

Ist der Wert wirklich einzigartig?

    
Roby 09.09.2011, 07:43
quelle

3 Antworten

18

Sie versuchen, eine Basiskonvertierung oder etwas Ähnliches zu machen. Wie auch immer, die Logik ist wie bei der Basiskonvertierung. 4 Bytes = 32 Bit. Also 32-Bit-Ganzzahl ohne Vorzeichen wäre gut.

In diesem Fall haben Sie:

%Vor%

es ist so:
Sie haben 4 Datenbytes, was

bedeutet %Vor%

wobei X entweder 1 oder 0 wert ist. Du mappst sie so:

%Vor%

und dann musst du sie nur hinzufügen, aber vorher verschiebst du die Bits. Sie verschieben die Bits A nach links um 8 * 3 (um die Grenzen von R , G und B Bits zu überschreiten), dann verschieben Sie die Bits R um 8 * 2 und so an.

Sie fügen diese 32-Bit-Ganzzahlen hinzu:

%Vor%

Dabei kann A , R , G , B entweder 0 oder 1 sein und als Ganzes den 8-Bit-Wert des Kanals darstellen. Dann fügen Sie sie einfach hinzu und erhalten das Ergebnis. Oder als DarkDust geschrieben, benutze nicht den Operator + , sondern stattdessen den Operator | (bitweise oder), seit es sollte in diesem speziellen Fall schneller sein.

    
AlexanderMP 09.09.2011, 07:50
quelle
7

Sie könnten dies tun:

Nehmen wir an, dass a , r , g und b vom Typ unsigned char / uint8_t :

sind %Vor%

Oder allgemeiner ( a , r , g und b mit beliebigem Integer-Typ):

%Vor%

Dies gibt Ihnen eine eindeutige Ganzzahl für jede ARGB-Kombination. Sie können die Werte folgendermaßen zurückbekommen:

%Vor%     
DarkDust 09.09.2011 07:49
quelle
3

Nicht ganz. Sie müssen Bit-Shifting und nicht einfache Multiplikation verwenden.

Jeder Wert in Ihrer Farbkarte ist 8 Bytes lang, richtig? Damit die resultierende Zahl eindeutig ist, muss sie alle zusammen für insgesamt 8 * 4 = 32 Bits zeichnen. Schau dir folgendes an:

Sie möchten:

%Vor%

und es so aussehen lassen:

%Vor%

Dies bedeutet, dass Sie Folgendes zusammenfügen müssen:

%Vor%

Wir erreichen dies, indem wir uns nach links verschieben. Nimmt man A und verschiebt man 24 Bits nach links, wird AAAAAAAA gefolgt von 24 0 Bits erzeugt, genau wie wir es wollen. Wenn Sie dieser Logik folgen, sollten Sie Folgendes tun:

%Vor%

Um zu veranschaulichen, warum das, was Sie vorschlagen (mit Multiplikation) nicht funktioniert, was Sie vorschlagen, ergibt sich in den folgenden Binärzahlen, die Sie überlappen sehen können:

%Vor%

Darüber hinaus werden die Werte für A, R, G, B einfach zur resultierenden Zahl addiert. Vereinfachen Sie Ihre Mathematik oben erhalten wir:

%Vor%

Hoppla.

    
lc. 09.09.2011 08:03
quelle

Tags und Links