currentValue是红色,绿色或蓝色的当前光照值。
newValue是当前颜色灯加亮度的结果
调整图像的对比度可以用这个公式 来完成:
factor = (259 * (contrast + 255)) / (255 * (259 - contrast))
color = GetPixelColor(x, y)
newRed = Truncate(factor * (Red(color) - 128) + 128)
newGreen = Truncate(factor * (Green(color) - 128) + 128)
newBlue = Truncate(factor * (Blue(color) - 128) + 128)主要计算是获取将应用于每个颜色值的对比度因子。截断是一个确保值保持在0到255之间的函数。
让我们将这些函数写入JavaScript:
function applyBrightness(data, brightness) {
for (var i = 0; i < data.length; i+= 4) {
data[i] += 255 * (brightness / 100);
data[i+1] += 255 * (brightness / 100);
data[i+2] += 255 * (brightness / 100);
}
}function truncateColor(value) {
if (value < 0) {
value = 0;
} else if (value > 255) {
value = 255;
}
return value;
}
function applyContrast(data, contrast) {
var factor = (259.0 * (contrast + 255.0)) / (255.0 * (259.0 - contrast));
for (var i = 0; i < data.length; i+= 4) {
data[i] = truncateColor(factor * (data[i] - 128.0) + 128.0);
data[i+1] = truncateColor(factor * (data[i+1] - 128.0) + 128.0);
data[i+2] = truncateColor(factor * (data[i+2] - 128.0) + 128.0);
}
}
在这种情况下,您不需要truncateColor函数,因为Uint8ClampedArray会截断这些值,但为了翻译我们在其中添加的算法。
需要记住的一点是,如果应用亮度或对比度,则图像数据被覆盖后无法回到之前的状态。如果我们想要重置为原始状态,则原始图像数据必须单独存储以供参考。保持图像变量对其他函数可访问将会很有帮助,因为您可以使用该图像来重绘画布和原始图像。
var image = document.getElementById('SourceImage');function redrawImage() {
context.drawImage(image, 0, 0);
}
使用视频
为了使它适用于视频,我们将采用我们的初始图像脚本和HTML代码并做一些小的修改。
HTML
通过替换以下行来更改视频元素的Image元素:
<img src>…with this:
<video src></video>
JavaScript
替换这一行:
var image = document.getElementById('SourceImage');
…添加这行:
var video = document.getElementById('SourceVideo');
要开始处理视频,我们必须等到视频可以播放。









