在前端开发中,常常需要对图片进行特效处理。高斯模糊是一种非常常见的效果之一,利用该效果可以将图片变得柔和、清晰且不失真。
在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实现高斯模糊效果是一个非常简单而又实用的处理方法。利用该方法可以帮助前端开发者在图片处理时达到更高的效果操作。