быстрый линейный в sRGB

Это хороший способ преобразовать цвет из линейного пространства от 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) )];
}

1

Решение

Да, это выглядит хорошо для меня. На самом деле вы можете использовать меньшую таблицу.

Если бы я чувствовал себя педантичным, я бы сказал, что ваше преобразование из float в int всегда делает значение немного темнее. Вы можете улучшить это, изменив строку 6:

float Lin = (i+0.5) / (float) (table.length-1);

или изменив строку 16:

return 255 & table[(int)( Linear*(table.length-1) + 0.5 )];

но не оба. Любое исправление центрирует ошибку округления на нуле. Однако ошибка округления все еще существует, и она настолько мала, что не стоит упоминать ее, поэтому я думаю, что ваш код в порядке.

0

Другие решения


По вопросам рекламы [email protected]