Wzór do regulacji jasności / kontrastu na płótnie?

Tak jak istnieje formuła do konwersji obrazu na skalę szarości, czy istnieje formuła na zwiększenie jasności obrazu i zmniejszenie go na tym samym poziomie? Próbowałem dodać wartość do każdego z pikseli r, g i b. Zwiększa jasność, ale kiedy zmniejszam tę samą wartość, nie odzyskuję swojej oryginalnej wartości.

var pixels = context.getImageData(...);

//loop over the pixel data and add a value
p[i] = p[i]+100;
p[i+1] = p[i+1]+100;
p[i+2] = p[i+2]+100;

To rozjaśnia obraz. Ale kiedy zmniejszę 100 z każdego piksela, nie odzyskuję oryginalnego obrazu.

Czytam w internecie, że istnieją pewne formuły do ​​prawidłowego obliczenia. Czy ktoś może to wyjaśnić? I podobnie dla kontrastu i gamma?

AKTUALIZACJA:

Dziękuję wszystkim za sugestie. Próbowałem tego po przejrzeniu niektórych postów poniżej.

Aby zwiększyć jasność:

var pixels = context.getImageData(...);

//loop over the pixel data and add a value
p[i] = p[i]+100 < 255 ? p[i]+100 : 255;
p[i+1] = p[i+1]+100 < 255 ? p[i+1]+100 : 255;
p[i+2] = p[i+2]+100 < 255 ? p[i+2]+100 : 255;

I w celu zmniejszenia jasności:

var pixels = context.getImageData(...);

//loop over the pixel data and add a value
p[i] = p[i]-100 >= 0 ? p[i]-100 : 0;
p[i+1] = p[i+1]-100 >= 0 ? p[i+1]-100 : 0;
p[i+2] = p[i+2]+100 >= 0 ? p[i+2]-100 : 0;

Widzę, że przyrost działa dobrze, ale gdy go zmniejszę, nadal nie otrzymam oryginalnego obrazu, jest niewielka różnica między oryginalnym i rozjaśnionym obrazem!

Co ja robię źle?

questionAnswers(2)

yourAnswerToTheQuestion