伽玛没有负值。理想情况下,该值将介于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);
}
}
我不知道应用程序应该如何调整伽玛值,但我想它是用值调整器完成的。如果是这样,您应该动态调整伽马值,给出最小和最大范围。我没有测试代码,这不是我的范围,但希望这个想法很清楚。
编辑:
要了解伽玛校正的原理,首先要如何定义伽玛。
伽玛是改变像素输入的显示器特性。Gamma 校正是反转线性 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
是显示器使用的伽玛值。
因此,伽马校正只不过是输入值上升到伽马倒数的幂。因此,要将 gamma 恢复到原始值,请在应用 gamma 校正之前应用公式。
蓝线表示在将像素发送到显示器之前需要应用到像素的逆伽马曲线。当您的显示器将其伽马曲线(红线)应用于像素时,结果是一条线性线(绿线),代表您预期的 RGB 像素值。