He visto en algunas bases de código de software de gráficos de computadora que a veces los bits más altos de datos de imagen en formato RGB565 se replican en los bits más bajos cuando se convierten al formato RGBA8888 de mayor profundidad de bits.
He encontrado, por ejemplo, el comentario del usuario "eq" en este hilo de gamedev.net :
Prefiero replicar los bits superiores en los bits inferiores indefinidos:
R8 = (R5 << 3) | (R5 >> 2);
Sin embargo, no entiendo la razón detrás.
¿De qué sirve el propósito de replicar esos bits en los datos convertidos?
Respuestas:
Sin replicar los bits, los LSB serán 0, por lo que para el valor máximo de 0x1f (máximo para 5 bits) se expandiría a 0xf8 cuando se convierta a 8 bits. Lo que desea es 0xff, por lo que el rango de 0x00-> 0x1f se asignará a 0x00-> 0xff en lugar de 0x00-> 0xf8. Sin fusionar el LSB, no podrá convertir 0x1f, 0x1f, 0x1f a blanco (0xff, 0xff, 0xff). Por cierto, esto es lo mismo que N * 0xff / 0x1f.
fuente
En realidad, hay una razón matemática razonablemente buena para hacer la replicación de bits:
Primera nota que la cadena de n bits,norte , en realidad representa el valor norte2norte- 1 y queremos producir la cadena de m bits, METRO , dónde n < m y
norte2norte- 1≈METRO2metro- 1
Primero escalamos el numerador y el denominador connorte. (2norte+ 1 )(2norte- 1 ) (2norte+ 1 )≈METRO2metro- 1
y esto se simplifica a
norte. (2norte+ 1 )22 n- 1≈METRO2metro- 1
En tu caso,n ∈ { 5 , 6 } y m = 8 y podemos "parar" aquí, pero el proceso puede repetirse (ad nauseum), si m >> n.
A continuación hacemos la aproximación ...norte. (2norte+ 1 )22 n≈METRO2metro que se simplifica a
norte. (2norte+ 1 )22 n - m≈ M
Tenga en cuenta quenorte. (2norte+ 1 ) es equivalente a repetir la cadena de n bits, para crear una cadena de 2 bits, y la división se desvía del 2 n - m LSB para dejar un resultado de M bits.
QED
Por supuesto, el cálculo 'correcto' esMETRO= ⌊ ((2metro- 1 ) N2norte- 1+12⌋ pero esta aproximación, en general, funciona la mayor parte del tiempo. Por supuesto, hay momentos en que es inexacto, pero IIRC solo por un bit y con poca frecuencia.
fuente