В некоторых базах кода программного обеспечения компьютерной графики я видел, что иногда старшие биты данных изображения в формате RGB565 реплицируются в младшие биты при преобразовании в формат RGBA8888 с большей глубиной бит.
Например, я нашел комментарий пользователя "eq" в этой теме на gamedev.net :
Я предпочитаю копировать старшие биты в неопределенные младшие биты:
R8 = (R5 << 3) | (R5 >> 2);
Однако я не понимаю причину этого.
Какая польза от репликации этих битов в преобразованные данные?
Ответы:
Без репликации битов младшие биты будут равны 0, поэтому при максимальном значении 0x1f (максимум для 5 бит) он расширится до 0xf8 при преобразовании в 8 бит. То, что вы хотите, это 0xff, поэтому диапазон 0x00-> 0x1f будет отображаться в 0x00-> 0xff вместо 0x00-> 0xf8. Без объединения LSB вы не сможете конвертировать 0x1f, 0x1f, 0x1f в белый (0xff, 0xff, 0xff). Кстати, это то же самое, что и N * 0xff / 0x1f.
источник
На самом деле есть достаточно веская математическая причина для выполнения битовой репликации:
Сначала обратите внимание, что n-битная строка,N на самом деле представляет ценность N2N- 1 и мы хотим получить m-битную строку, M , где п < м а также
N2N- 1≈M2м- 1
Мы сначала масштабируем числитель и знаменатель сN, (2N+ 1 )(2N- 1 ) (2N+ 1 )≈M2м- 1
и это упрощает
N, (2N+ 1 )22 н- 1≈M2м- 1
В твоем случае,n ∈ { 5 , 6 } а также м = 8 и мы можем «остановиться» здесь, но процесс можно повторить (до тошноты), если m >> n.
Затем мы сделаем приближение ...N, (2N+ 1 )22 н≈M2м что упрощает
N, (2N+ 1 )22 н - м≈ М
Обратите внимание, чтоN, (2N+ 1 ) эквивалентно повторению n-битной строки для создания 2n-битной строки, и деление сдвигается 2 н - м МЗБ, чтобы оставить результат M бит.
QED
Конечно, «правильный» расчетM= ⌊ ((2м- 1 ) N2N- 1+12⌋ но это приближение, как правило, работает большую часть времени. Конечно, бывают случаи, когда это неточно, но IIRC только на один бит и относительно редко.
источник