Formel zum Anpassen von Helligkeit / Kontrast auf Leinwand?

So wie es eine Formel zum Konvertieren eines Bildes in Graustufen gibt, gibt es eine Formel zum Erhöhen der Helligkeit eines Bildes und Verringern derselben Stufe? Ich habe versucht, jedem der Pixel r, g und b einen Wert hinzuzufügen. Es erhöht zwar die Helligkeit, aber wenn ich denselben Wert reduziere, erhalte ich meinen ursprünglichen Wert nicht zurück.

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;

Dies hellt das Bild auf. Aber wenn ich 100 von jedem Pixel verkleinere, bekomme ich mein Originalbild nicht zurück.

Ich habe im Internet gelesen, dass es bestimmte Formeln gibt, um dies richtig zu berechnen. Kann das jemand erklären? Und ähnlich für Kontrast und Gamma?

AKTUALISIEREN:

Vielen Dank für die Vorschläge. Ich habe es versucht, nachdem ich einige der folgenden Posts durchgesehen habe.

Zur Erhöhung der Helligkeit:

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;

Und zur Reduzierung der Helligkeit:

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;

Ich kann sehen, dass das Inkrement gut funktioniert, aber wenn ich es dekrementiere, erhalte ich immer noch nicht das Originalbild, es gibt einen kleinen Unterschied zwischen dem Originalbild und dem aufgehellten Bild!

Was mache ich falsch?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage