CSS对比滤镜

时间:2017-03-08 13:34:39

标签: javascript css canvas filter pixel

css滤镜对比度如何工作?有配方吗?我想在javascript中重现,我需要一个公式。 例如css滤镜亮度(2)取每个像素并乘以2,但相比之下,我没有任何想法 感谢

1 个答案:

答案 0 :(得分:0)

乘以2是对比度滤波器。图像RGB值的所有乘法和除法都会影响对比度。

我喜欢使用的功能是指数缓动功能,其中功率控制对比度。

function contrastPixel(r,g,b,power) {
    r /= 255;  // normalize channels
    g /= 255;
    b /= 255;
    var rr = Math.pow(r,power);  // raise each to the power
    var gg = Math.pow(r,power);
    var bb = Math.pow(r,power);
    r = Math.floor((rr / (rr + Math.pow(1 - r, power)))*255);
    g = Math.floor((gg / (gg + Math.pow(1 - g, power)))*255);
    b = Math.floor((bb / (bb + Math.pow(1 - b, power)))*255);
    return {r,g,b};    
}

使用它

var dat = ctx.getPixelData(0,0,100,100);
var data = dat.data;
var i = 0;
while(i < data.length){
    var res = contrastPixel(data[i],data[i+1],data[i+2],power);
    data[i++] = res.r;
    data[i++] = res.g;
    data[i++] = res.b;
    i++;
}
ctx.putImageData(dat,0,0);

参数幂控制对比度。

power = 1; // no change to the image
0 < power < 1; // reduces contrast
1 < power; // increases contrast

由于功率的缩放是对数的,因此使用线性滑块很难控制。要为滑块提供线性感觉,请使用以下说明从滑块

获取值

对于最小-100和最大100且中心0(0没有对比度变化)的滑块,使用

获取对比度功率值
power = Math.pow(((Number(slider.value)* 0.0498) + 5)/5,Math.log2(10));

它不是完全线性的,范围有限但会满足大多数需求。

测试图像显示结果。中心底部是原始的。使用上面段落中的刻度从左到右滑块值-100,-50,50,100

enter image description here