Warum die höheren Bits von RGB565 bei der Konvertierung in RGBA8888 replizieren?

7

Ich habe in den Codebasen einiger Computergrafiksoftware gesehen, dass manchmal die höheren Bits von Bilddaten im RGB565-Format in die niedrigeren Bits repliziert werden, wenn sie in das Format RGBA8888 mit höherer Bittiefe konvertiert werden.

Ich habe zum Beispiel den Kommentar des Benutzers "eq" in diesem gamedev.net-Thread gefunden :

Ich ziehe es vor, die höheren Bits in die undefinierten niedrigeren Bits zu replizieren:
R8 = (R5 << 3) | (R5 >> 2);

Allerdings verstehe ich den Grund dafür nicht.

Was nützt der Zweck, diese Bits in die konvertierten Daten zu replizieren?

abwischen
quelle
1
Ohne Replikation der Bits sind die LSBs 0, sodass sie für den Maximalwert von 0x1f (maximal für 5 Bits) bei Konvertierung in 8 Bit auf 0xf8 erweitert werden. Was Sie wollen, ist 0xff, sodass der Bereich von 0x00-> 0x1f auf 0x00-> 0xff anstatt auf 0x00-> 0xf8 abgebildet wird.
PaulHK
2
@PaulHK Bitte poste das als Antwort. Es ist vollständig wie es ist, aber als Kommentar ist es nicht durchsuchbar.
Dan Hulme
Ja danke @PaulHK dies beantwortet meine Frage richtig
Wip

Antworten:

7

Ohne Replikation der Bits sind die LSBs 0, sodass sie für den Maximalwert von 0x1f (maximal für 5 Bits) bei Konvertierung in 8 Bit auf 0xf8 erweitert werden. Was Sie wollen, ist 0xff, sodass der Bereich von 0x00-> 0x1f auf 0x00-> 0xff anstatt auf 0x00-> 0xf8 abgebildet wird. Ohne das Zusammenführen des LSB könnten Sie 0x1f, 0x1f, 0x1f nicht in Weiß (0xff, 0xff, 0xff) konvertieren. Dies ist übrigens dasselbe wie N * 0xff / 0x1f.

Example: 

left shift only (<< 3)
%---00001 -> %00001000     (0x01 -> 0x08)
%---10000 -> %10000000     (0x10 -> 0x80)
%---11111 -> %11111000     (0x1f -> 0xf8)

merging MSB to LSB 
%---00001 -> %00001000     (0x01 -> 0x08)
%---10000 -> %10000100     (0x10 -> 0x84)
$---11111 -> %11111111     (0x1f -> 0xff)
PaulHK
quelle
7

Es gibt tatsächlich einen ziemlich guten mathematischen Grund für die Bitreplikation:

NN2n1Mn<m

N2n1M2m1

N.(2n+1)(2n1)(2n+1)M2m1
N.(2n+1)22n1M2m1

n{5,6}m=8

N.(2n+1)22nM2m
N.(2n+1)22nmM

N.(2n+1)2nm

QED

M=((2m1)N2n1+12

Simon F.
quelle
2
Vielen Dank für eine ausführliche Erklärung mit schönen Formeln. Ich war neugierig auf den durch die Annäherung verursachten Fehler und habe dieses Diagramm erstellt, in dem beide Formeln verglichen werden: desmos.com/calculator/cvaqofyvbf . Ich bevorzuge jedoch die Antwort von PaulHK, da sie leichter zu verstehen ist.
Wischen Sie den
1
Kleiner Streit, wenn m> = 2n ist, müssen Sie Ihre "Approximations" -Gleichung ändern. Ein Extrem ist beispielsweise, wenn n = 1 ist, müssen Sie die Zeichenfolge 8 Mal wiederholen (dh log2 (8) = 3 Schritte ausführen). Natürlich, wenn Sie Pad mit „10 ... 0“ anstelle von Nullen, dann im Durchschnitt Sie einen niedrigeren Fehler haben werden, aber die Extreme verlieren. "Allerdings bevorzuge ich PaulHKs Antwort" :-) Nun, es gibt keine Erklärung für den Geschmack von 8P.
Simon F