淘先锋技术网

首页 1 2 3 4 5 6 7

在前端开发中,常常需要对图片进行特效处理。高斯模糊是一种非常常见的效果之一,利用该效果可以将图片变得柔和、清晰且不失真。

在javascript中实现高斯模糊,需要使用canvas。使用canvas处理图片时需要先提取图像数据,将图像数据放入数组传递给高斯模糊函数,处理完成后再将图像数组还原并绘制在canvas上。

//高斯模糊函数
function gaussianBlur(ctx, imgData, radius) {
var pixes = imgData.data;
var width = imgData.width;
var height = imgData.height;
var gaussMatrix = [],
gaussSum = 0,
x, y,
r, g, b, a,
i, j, k, len;
radius = Math.floor(radius) || 3;
var sigma = radius / 3;
a = 1 / (Math.sqrt(2 * Math.PI) * sigma);
b = -1 / (2 * sigma * sigma);
//生成高斯矩阵
for (i = 0, y = -radius; y <= radius; y++, i++) {
gaussMatrix[i] = [];
for (j = 0, x = -radius; x <= radius; x++, j++) {
r = Math.sqrt(x * x + y * y);
gaussMatrix[i][j] = a * Math.exp(b * (r * r));
gaussSum += gaussMatrix[i][j];
}
}
//归一化, 保证高斯矩阵的值在[0,1]之间
for (i = 0, len = gaussMatrix.length; i < len; i++) {
for (j = 0; j < len; j++) {
gaussMatrix[i][j] /= gaussSum;
}
}
//利用高斯矩阵,进行图像处理
for (y = 0; y < height; y++) {
for (x = 0; x < width; x++) {
r = g = b = a = 0;
gaussSum = 0;
for (i = -radius; i <= radius; i++) {
j = x + i;
if (j >= 0 && j < width) {
k = y * width + j;
r += pixes[k * 4] * gaussMatrix[radius + i][radius];
g += pixes[k * 4 + 1] * gaussMatrix[radius + i][radius];
b += pixes[k * 4 + 2] * gaussMatrix[radius + i][radius];
gaussSum += gaussMatrix[radius + i][radius];
}
}
i = y * width + x;
pixes[i * 4] = r / gaussSum;
pixes[i * 4 + 1] = g / gaussSum;
pixes[i * 4 + 2] = b / gaussSum;
}
}
ctx.putImageData(imgData, 0, 0);
}
//调用高斯模糊函数
var canvas = document.querySelector('canvas');
var ctx = canvas.getContext('2d');
var img = new Image();
img.onload = function() {
canvas.width = img.width;
canvas.height = img.height;
ctx.drawImage(img, 0, 0);
var imgData = ctx.getImageData(0, 0, canvas.width, canvas.height);
gaussianBlur(ctx, imgData, 10);
}
img.src='image.jpg';

通过上述代码,利用高斯矩阵进行图像处理即可实现高斯模糊效果。半径越大,图像越模糊,但处理时间也会逐步增加,因此根据实际需求选择合适的半径值。

总的来说,javascript实现高斯模糊效果是一个非常简单而又实用的处理方法。利用该方法可以帮助前端开发者在图片处理时达到更高的效果操作。