Erstmal was zum besseren Codeverständnis.
GetRValue, GetBValue, GetGValue und
RGB anstatt wild zumzushiften.
Bereichsprüfung <> Indexprüfung
(R - i)
wird wohl ab und an negative Werte erzeugen, welche natürlich nicht in ein Byte rein passen.
Und insgesamt können durch das
+ i
auch zu große Werte entstehen,
also <0 oder >255.
* Bereichsprüfung deaktivieren (standardmäßig ist die eh aus, also bist du wohl selbst Schuld) und den "Überlauf" ignorieren
* ein harter Cast und den Überlauf abschneiden
* vorher Prüfen und erst garnichts Negatives berechnen
* oder
* oder
* ...