Небольшой вопрос. А почему бы не сделать как в OpenGL?
Вы берёте максимальную составляющую за 1
Из заданного бита (пикселя) цвета выделяете составляющую для 32-х бит и восстанавливаете для 16-ти.
1 = 255 (R, G, B or alpha)
допустим R = 130, (подсчёт примерный)
составляющая 1 / 255 = 0.004 далее 0.004 * 130 = 0,52 (погрешность появляется, но можно делать точнее)
переводим в 16: 1 / 31 = 0.032 находим составляющую 0.52 / 0.032 = 16.25 округляем к ближайшему = 16
Для остальных цветов так же. Не забываем для R и B по 31, для G 63.
Возможно займёт порядочно времени по работе с большим объёмом.
Google translate
A small question. Why not do it like in OpenGL?
You take the maximum component for 1
From a given bit (pixel) of color, select a component for 32 bits and restore for 16 bits.
1 = 255 (R, G, B or alpha)
let's say R = 130, (approximate calculation)
component 1/255 = 0.004 further 0.004 * 130 = 0.52 (the error appears, but you can do it more precisely)
translate into 16: 1/31 = 0.032 find the component 0.52 / 0.032 = 16.25 round to the nearest = 16
For other colors the same. Don't forget 31 for R and B, 63 for G.
It may take a lot of time to work with a large volume.