ガンマには負の値はありません。理想的には、この値はとの間の範囲に0.01
なり7.99
ます。したがって、ガンマを元の値に戻すには、画像の元の値を使用して新しいキャンバスインスタンスを作成してからインスタンス化するか、元の画像を使用してピクセルのプールを作成して元に戻すことができます。
ガンマリダクションのアルゴリズムをどのように構築するかというスクリプトを書きました。
var gamma = 0.5;
var gammaCorrection = 1 / gamma;
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
var imageData = ctx.getImageData(0.0, canvas.width, canvas.height);
function GetPixelColor(x, y) {
var index = parseInt(x + canvas.width * y) * 4;
var rgb = {
r : imageData.data[index + 0],
g : imageData.data[index + 1],
b : imageData.data[index + 2]
};
return rgb;
}
function SetPixelColor(x, y, color) {
var index = parseInt(x + this.width * y) * 4;
var data = imageData.data;
data[index+0] = color.r;
data[index+1] = color.g;
data[index+2] = color.b;
};
for (y = 0; y < canvas.height; y++) {
for (x = 0; x < canvas.width; x++) {
var color = GetPixelColor(x, y)
var newRed = Math.pow(255 * (color.r / 255), gammaCorrection);
var newGreen = Math.pow(255 * (color.g / 255), gammaCorrection);
var newBlue = Math.pow(255 * (color.b / 255), gammaCorrection);
var color = {
r: newRed,
g: newGreen,
b: newBlue
}
SetPixelColor(x, y, color);
}
}
アプリケーションがガンマ値をどのように調整する必要があるかはわかりませんが、値アジャスターを使用して調整されていると思います。その場合は、最小範囲と最大範囲を指定してガンマ値を動的に調整する必要があります。私はコードをテストしませんでした、これは私の範囲ではありませんでしたが、アイデアはうまくいけば明確です。
編集:
最初にガンマ補正の原理を理解するには、代わりにガンマを定義する方法を説明します。
ガンマは、ピクセル入力を変更するモニターの特殊性です。ガンマ補正は、線形RGB値のプロセスを反転して、最終出力が線形のままになるようにする行為です。たとえば、オブジェクトの光強度が0.5であると計算した場合、結果を0.5としてピクセルに保存しません。として保存しpow(0.5, 1.0/2.2) = 0.73
ます。モニターに0.73を送信すると、値にガンマが適用され、必要な値が生成されpow(0.73, 2.2) = 0.5
ます。これを行うには、逆ガンマ関数を適用します。
o=pow(i, 1.0/gamma)
どこ
o
は出力値です。
i
入力値です。
gamma
モニターで使用されるガンマ値です。
したがって、ガンマ補正は、入力値のガンマの逆乗への上昇に他なりません。したがって、ガンマを元の値に戻すには、ガンマ補正が適用される前に数式を適用します。

青い線は、ピクセルがモニターに送信される前にピクセルに適用する必要がある逆ガンマ曲線を表しています。モニターがガンマ曲線(赤い線)をピクセルに適用すると、結果は目的のRGBピクセル値を表す線形線(緑の線)になります。