使用Canvas操作像素的方法

2020-04-21 07:43:37易采站长站整理

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');

要开始处理视频,我们必须等到视频可以播放。