使用Canvas操作像素的方法

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

简而言之,这个数组在每个位置存储范围从0到255的值,这使得它成为RGBA格式的完美解决方案,因为每个部分都由0到255个值表示。

RGBA颜色

颜色可以用RGBA格式表示,它是红色,绿色和蓝色的组合。 A表示颜色不透明度的α值。

数组中的每个位置代表一个颜色(像素)通道值。

第一个位置是红色值
第二个位置是绿色值
第三个位置是蓝色值
第四个位置是Alpha值
第5个位置是下一个像素红色值
第6个位置是下一个像素的绿色值
第7个位置是下一个像素的蓝色值
第8个位置是下一个像素Alpha值
等等…

如果您有2×2图像,那么我们有一个16位阵列(每个2×2像素x 4值)。

2×2图像缩小了

该数组将如下所示:


// RED GREEN BLUE WHITE
[ 255, 0, 0, 255, 0, 255, 0, 255, 0, 0, 255, 255, 255, 255, 255, 255]

更改像素数据

我们可以做的最快的事情之一是通过将所有RGBA值更改为255来将所有像素设置为白色。


// Use a button to trigger the "effect"
var button = document.getElementById('Button');

button.addEventListener('click', onClick);

function changeToWhite(data) {
for (var i = 0; i < data.length; i++) {
data[i] = 255;
}
}

function onClick() {
var imageData = context.getImageData(0, 0, canvas.width, canvas.height);

changeToWhite(imageData.data);

// Update the canvas with the new data
context.putImageData(imageData, 0, 0);
}

数据将作为参考传递,这意味着我们对它做出的任何修改,它都会改变传递参数的值。

反转颜色

不需要太多计算的好效果就是反转图像的颜色。

可以使用XOR运算符(^)或此公式255 – 值(值必须介于0-255之间)来反转颜色值。


function invertColors(data) {
for (var i = 0; i < data.length; i+= 4) {
data[i] = data[i] ^ 255; // Invert Red
data[i+1] = data[i+1] ^ 255; // Invert Green
data[i+2] = data[i+2] ^ 255; // Invert Blue
}
}

function onClick() {
var imageData = context.getImageData(0, 0, canvas.width, canvas.height);

invertColors(imageData.data);

// Update the canvas with the new data
context.putImageData(imageData, 0, 0);
}

我们正在像前面那样将循环增加4而不是1,所以我们可以从像素到像素,每个像素填充数组中的4个元素。

alpha值对反转颜色没有影响,所以我们跳过它。

亮度和对比度

使用下面的公式可以调整图像的亮度:newValue = currentValue + 255 *(brightness / 100)。

亮度必须介于-100和100之间