Формула для регулировки яркости / контраста на холсте?

Так же, как есть формула для преобразования изображения в оттенки серого, есть ли формула для увеличения яркости изображения и уменьшения его на том же уровне? Я попытался добавить значение для каждого из пикселей r, g и b. Это увеличивает яркость, но когда я уменьшаю то же значение, я неВерни мне мое первоначальное значение.

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;

Это осветляет изображение. Но когда я уменьшаю 100 с каждого пикселя, я неверни мое оригинальное изображение.

Я читал в Интернете, что существуют определенные формулы для правильного расчета. Кто-нибудь может это объяснить? И аналогично для контраста и гаммы?

ОБНОВИТЬ:

Спасибо всем за предложения. Я попробовал это после прохождения некоторых постов ниже.

Для увеличения яркости:

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;

И для уменьшения яркости:

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;

Я вижу, что приращение работает нормально, но когда я уменьшаю его, я все еще нене получить оригинальное изображение, тамНебольшая разница между оригинальным и ярким изображением!

Что я делаю неправильно?