J'ai vu dans les bases de code de certains logiciels d'infographie que parfois les bits supérieurs des données d'image au format RGB565 sont répliqués dans les bits inférieurs lors de la conversion au format RGBA8888 à profondeur plus élevée.
J'ai trouvé par exemple le commentaire de l'utilisateur "eq" dans ce fil gamedev.net :
Je préfère répliquer les bits supérieurs dans les bits inférieurs non définis:
R8 = (R5 << 3) | (R5 >> 2);
Cependant, je ne comprends pas la raison derrière.
À quoi sert la réplication de ces bits dans les données converties?
color-management
conversion
essuyer
la source
la source
Réponses:
Sans réplication des bits, les LSB seront à 0, donc pour la valeur maximale de 0x1f (max pour 5 bits), elle s'étendrait à 0xf8 lors de la conversion en 8 bits. Ce que vous voulez est 0xff donc la plage de 0x00-> 0x1f sera mappée sur 0x00-> 0xff au lieu de 0x00-> 0xf8. Sans fusionner le LSB, vous ne pourriez pas convertir 0x1f, 0x1f, 0x1f en blanc (0xff, 0xff, 0xff). Soit dit en passant, c'est la même chose que N * 0xff / 0x1f.
la source
Il existe en fait une raison mathématique raisonnablement bonne pour effectuer la réplication de bits:
Notez d'abord que la chaîne de n bits, , représente en fait la valeur et nous voulons produire la chaîne de m bits, , où etN N2n−1 M n<m N2n−1≈M2m−1
Nous échelonnons d'abord le numérateur et le dénominateur avec et cela se simplifie enN.(2n+1)(2n−1)(2n+1)≈M2m−1 N.(2n+1)22n−1≈M2m−1
Dans votre cas, et et nous pouvons "arrêter" ici, mais mais le processus peut être répété, (ad nauseum), si m >> n.n∈{5,6} m=8
Nous faisons ensuite l'approximation ... qui simplifie enN.(2n+1)22n≈M2m N.(2n+1)22n−m≈M
Notez que équivaut à répéter la chaîne de n bits, pour créer une chaîne de 2n bits, et la division décale les LSB de pour laisser un résultat de M bits.N.(2n+1) 2n−m
QED
Bien sûr, le calcul «correct» est mais cette approximation, en général , fonctionne la plupart du temps. Bien sûr, il y a des moments où il est inexact, mais IIRC seulement d'un bit et relativement rarement.M=⌊((2m−1)N2n−1+12⌋
la source