画像をグレースケールに変換する公式があるように、画像の明るさを上げて同じレベルで下げる公式はありますか? 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;
インクリメントが正常に機能していることはわかりますが、デクリメントしても元の画像は得られません。元の画像と明るくした画像には少し違いがあります。
私は何を間違っていますか?