Это хороший способ преобразовать цвет из линейного пространства от 0,0 до 1,0 в пространство sRGB от 0 до 255, используя таблицу поиска таким образом?
Пример, в Джава:
byte[] table;
void initializeTable()
{
table = new byte[65536];
for(int i = 0; i < table.length; i++){
float Lin = i / (float) (table.length-1);
if(Lin<=0.0031308f)
table[i] = (byte)(255*(Lin*12.92f));
else
table[i] = (byte)(255*( (1+0.055f)*Math.pow(Lin,1/2.4f)-0.055f) );
}
}
int sRGB(float Linear/*in range 0..1*/) // Will return 0..255 integer sRGB
{
return 255 & table[(int)( Linear*(table.length-1) )];
}
Да, это выглядит хорошо для меня. На самом деле вы можете использовать меньшую таблицу.
Если бы я чувствовал себя педантичным, я бы сказал, что ваше преобразование из float в int всегда делает значение немного темнее. Вы можете улучшить это, изменив строку 6:
float Lin = (i+0.5) / (float) (table.length-1);
или изменив строку 16:
return 255 & table[(int)( Linear*(table.length-1) + 0.5 )];
но не оба. Любое исправление центрирует ошибку округления на нуле. Однако ошибка округления все еще существует, и она настолько мала, что не стоит упоминать ее, поэтому я думаю, что ваш код в порядке.