Vi em algumas bases de código de alguns softwares de computação gráfica que, às vezes, os bits mais altos dos dados de imagem no formato RGB565 são replicados nos bits mais baixos ao converter para o formato RGBA8888 de profundidade com bits mais altos.
Encontrei, por exemplo, o comentário do usuário "eq" neste tópico do gamedev.net :
Eu prefiro replicar os bits mais altos nos bits mais indefinidos:
R8 = (R5 << 3) | (R5 >> 2);
No entanto, eu não entendo a razão por trás.
Para que serve replicar esses bits nos dados convertidos?
color-management
conversion
limpe
fonte
fonte
Respostas:
Sem replicar os bits, os LSBs serão 0, portanto, para o valor máximo de 0x1f (máximo de 5 bits), ele seria expandido para 0xf8 quando convertido em 8 bits. O que você deseja é 0xff, então o intervalo de 0x00-> 0x1f será mapeado para 0x00-> 0xff em vez de 0x00-> 0xf8. Sem mesclar o LSB, você não conseguiria converter 0x1f, 0x1f, 0x1f em branco (0xff, 0xff, 0xff). Aliás, isso é o mesmo que N * 0xff / 0x1f.
fonte
Na verdade, existe uma razão matemática razoavelmente boa para fazer a replicação de bits:
Primeira nota que a cadeia n-bit, , na verdade, representa o valor de e queremos produzir a seqüência de m-bit, , onde eN N2n−1 M n<m N2n−1≈M2m−1
Escalamos primeiro o numerador e o denominador com e isso simplifica paraN.(2n+1)(2n−1)(2n+1)≈M2m−1 N.(2n+1)22n−1≈M2m−1
No seu caso, e e nós podemos "stop" aqui, mas mas o processo pode ser repetido, (ad nauseum), se m >> n.n∈{5,6} m=8
Em seguida, fazemos a aproximação ... que simplifica paraN.(2n+1)22n≈M2m N.(2n+1)22n−m≈M
Observe que é equivalente a repetir a sequência de n bits, para criar uma sequência de 2 bits e a divisão desliga os LSBs de para deixar um resultado em M bits.N.(2n+1) 2n−m
QED
Obviamente, o cálculo 'correto' é mas essa aproximação, em geral , funciona na maioria das vezes.É claro que há momentos em que é impreciso, mas o IIRC é apenas um pouco e relativamente pouco frequente.M=⌊((2m−1)N2n−1+12⌋
fonte