1.前言
随着前端技术的发展,越来越多的特效被应用到了网页中,其中图片滤镜效果便是其中之一。下面将介绍如何使用JavaScript语言实现一款基于滤镜效果的图片处理器。
2.搭建环境
2.1 安装Canvas
Canvas是HTML5新增的标签,它能够通过JavaScript脚本绘制2D图形,是我们实现图片处理器的重要工具。下面我们需要在html文件中添加Canvas标签,代码如下:
<canvas id="canvas"></canvas>
然后在JavaScript中获取Canvas元素:
const canvas = document.getElementById('canvas');
我们还需要指定Canvas的宽和高:
canvas.width = image.width;
canvas.height = image.height;
2.2 获取图片
要对图片进行处理,我们首先需要获取图片的二进制数据。可以通过使用FileReader对象将本地图片转换为base64编码的字符串
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = () => {
const img = new Image();
img.src = reader.result;
img.onload = () => {
//逻辑处理
};
};
3.实现图片滤镜效果
3.1 网格滤镜
网格滤镜是一种比较简单的滤镜效果,其原理是将图片分成小块,再将每一块的颜色值随机替换为附近的一块颜色值,达到一种像素化的效果。具体实现代码如下:
const gridFilter = (ctx, imgData, gridLength) => {
const pixels = imgData.data;
const width = imgData.width;
const height = imgData.height;
const grids = []; // 存储每一块的颜色值
// 将图片分块
for (let i = 0; i < height; i += gridLength) {
for (let j = 0; j < width; j += gridLength) {
const index = (i * 4) * width + j * 4;
const r = pixels[index];
const g = pixels[index + 1];
const b = pixels[index + 2];
grids.push([r, g, b, j, i]);
}
}
// 随机取一块颜色值替换为附近的颜色值
for (let i = 0; i < grids.length; i++) {
const x1 = Math.max(grids[i][3] - gridLength, 0);
const y1 = Math.max(grids[i][4] - gridLength, 0);
const x2 = Math.min(grids[i][3] + gridLength, width);
const y2 = Math.min(grids[i][4] + gridLength, height);
const randomIndex = Math.floor(Math.random() * (x2 - x1) * (y2 - y1)) + y1 * width + x1;
pixels[grids[i][4] * width * 4 + grids[i][3] * 4] = pixels[randomIndex * 4];
pixels[grids[i][4] * width * 4 + grids[i][3] * 4 + 1] = pixels[randomIndex * 4 + 1];
pixels[grids[i][4] * width * 4 + grids[i][3] * 4 + 2] = pixels[randomIndex * 4 + 2];
}
ctx.putImageData(imgData, 0, 0);
};
3.2 灰度滤镜
灰度滤镜是将图像从彩色变成黑白的滤镜效果。实现方法是将R、G、B三个颜色通道的值取平均值作为灰度值,然后将R、G、B值同时设置为这个平均值。
const greyFilter = (ctx, imgData) => {
const pixels = imgData.data;
const len = pixels.length;
for (let i = 0; i < len; i += 4) {
const grey = (pixels[i] + pixels[i + 1] + pixels[i + 2]) / 3;
pixels[i] = grey;
pixels[i + 1] = grey;
pixels[i + 2] = grey;
}
ctx.putImageData(imgData, 0, 0);
};
3.3 色调分离滤镜
色调分离滤镜是一种比较特殊的滤镜效果,它将图像的颜色分成几个级别,再将每个级别的颜色映射到不同的颜色上面去。
const colorFilter = (ctx, imgData, level) => {
const pixels = imgData.data;
const len = pixels.length;
const step = Math.floor(255 / level);
for (let i = 0; i < len; i += 4) {
const r = Math.floor(pixels[i] / step) * step;
const g = Math.floor(pixels[i + 1] / step) * step;
const b = Math.floor(pixels[i + 2] / step) * step;
pixels[i] = r;
pixels[i + 1] = g;
pixels[i + 2] = b;
}
ctx.putImageData(imgData, 0, 0);
};
4.总结
通过本文的介绍,我们了解到了如何使用JavaScript语言实现一款基于滤镜效果的图片处理器,并且介绍了三种滤镜效果的实现方法:网格滤镜、灰度滤镜和色调分离滤镜。使用这些滤镜效果能够使图片更加具有个性化和艺术感。