Прежде всего извините, если это дубликат, я не смог найти тему, отвечающую на мой вопрос.
Я пишу небольшую программу, которая будет использоваться для преобразования 32-битных значений с плавающей запятой в короткие значения int (16 бит) и unsigned char (8 бит). Это предназначено для HDR-изображений.
Из здесь я мог получить следующая функция (без зажима):
static inline uint8_t u8fromfloat(float x)
{
return (int)(x * 255.0f);
}
Я полагаю, что таким же образом мы могли бы получить короткий int, умножив на (pow( 2,16 ) -1)
Но потом я подумал об упорядоченном дизеринге и особенно о дизеринге по Байеру. Чтобы преобразовать в uint8_t, я полагаю, я мог бы использовать матрицу 4x4 и матрицу 8x8 для беззнакового короткого замыкания.
Я также подумал о справочной таблице для ускорения процесса следующим образом:
uint16_t LUT[0x10000] // 2¹⁶ values contained
и сохраните 2 ^ 16 коротких значений без знака, соответствующих поплавку. Эту же таблицу можно было бы затем использовать и для uint8_t из-за неявного приведения между unsigned short ↔ unsigned int
Но разве подобная справочная таблица не займет много памяти? Кроме того, как можно заполнить такую таблицу?!
Теперь я в замешательстве, что было бы лучше по вашему мнению?
РЕДАКТИРОВАТЬ после ответа uwind: скажем теперь, что я также хочу одновременно выполнить базовое преобразование цветового пространства, то есть перед преобразованием в U8/U16, выполнить преобразование цветового пространства (с плавающей запятой), а затем уменьшить его до U8/U16. . Не будет ли в этом случае использование LUT более эффективным? И да, у меня все еще была бы проблема с индексацией LUT.