HTML5canvas实现高斯模糊、刮刮乐

绝地灬酷狼 2022-05-12 09:38 447阅读 0赞

1.高斯模糊(Gaussian blur)

原理:将图片插入到canvas中,将canvas中的图片,getImageData得到图片的像素值,用高斯模糊函数进像素值进行处理后,再把值putImageData放到canvas中,就实现了图片的高斯模糊处理。

高斯模糊函数中的逻辑:

注意:此处是window整个页面进行加载,不可以用img来调用onload方法,会报错:高斯函数未被定义的错误。

注意:getImageData、putImageData两个方法在服务器中使用有效。

70

70 1

HTML代码:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>gauss</title>
  6. <style>
  7. #data{
  8. width: 400px;
  9. height: 300px;
  10. }
  11. </style>
  12. </head>
  13. <body>
  14. <img id="data" src="timg.jpg" alt="">
  15. <canvas id="canvas" height="500" width="500"></canvas>
  16. <script src="gaussFun.js"></script>
  17. <script>
  18. var oImg = document.getElementById('data');
  19. var canvas = document.getElementById('canvas');
  20. var ctx = canvas.getContext('2d');
  21. var oData,newSrc;
  22. window.onload = function () {
  23. ctx.drawImage(oImg,0,0,400,300);
  24. oData = ctx.getImageData(0,0,400,300);
  25. newSrc = gaussBlur(oData);
  26. ctx.putImageData(newSrc, 0, 0);
  27. }
  28. </script>
  29. </body>
  30. </html>

高斯模糊函数:

  1. function gaussBlur(imgData) {
  2. var pixes = imgData.data;
  3. var width = imgData.width;
  4. var height = imgData.height;
  5. var gaussMatrix = [],
  6. gaussSum = 0,
  7. x, y,
  8. r, g, b, a,
  9. i, j, k, len;
  10. var radius = 10;
  11. var sigma = 5;
  12. a = 1 / (Math.sqrt(2 * Math.PI) * sigma);
  13. b = -1 / (2 * sigma * sigma);
  14. //生成高斯矩阵
  15. for (i = 0, x = -radius; x <= radius; x++, i++){
  16. g = a * Math.exp(b * x * x);
  17. gaussMatrix[i] = g;
  18. gaussSum += g;
  19. }
  20. //归一化, 保证高斯矩阵的值在[0,1]之间
  21. for (i = 0, len = gaussMatrix.length; i < len; i++) {
  22. gaussMatrix[i] /= gaussSum;
  23. }
  24. //x 方向一维高斯运算
  25. for (y = 0; y < height; y++) {
  26. for (x = 0; x < width; x++) {
  27. r = g = b = a = 0;
  28. gaussSum = 0;
  29. for(j = -radius; j <= radius; j++){
  30. k = x + j;
  31. if(k >= 0 && k < width){//确保 k 没超出 x 的范围
  32. //r,g,b,a 四个一组
  33. i = (y * width + k) * 4;
  34. r += pixes[i] * gaussMatrix[j + radius];
  35. g += pixes[i + 1] * gaussMatrix[j + radius];
  36. b += pixes[i + 2] * gaussMatrix[j + radius];
  37. // a += pixes[i + 3] * gaussMatrix[j];
  38. gaussSum += gaussMatrix[j + radius];
  39. }
  40. }
  41. i = (y * width + x) * 4;
  42. // 除以 gaussSum 是为了消除处于边缘的像素, 高斯运算不足的问题
  43. // console.log(gaussSum)
  44. pixes[i] = r / gaussSum;
  45. pixes[i + 1] = g / gaussSum;
  46. pixes[i + 2] = b / gaussSum;
  47. // pixes[i + 3] = a ;
  48. }
  49. }
  50. //y 方向一维高斯运算
  51. for (x = 0; x < width; x++) {
  52. for (y = 0; y < height; y++) {
  53. r = g = b = a = 0;
  54. gaussSum = 0;
  55. for(j = -radius; j <= radius; j++){
  56. k = y + j;
  57. if(k >= 0 && k < height){//确保 k 没超出 y 的范围
  58. i = (k * width + x) * 4;
  59. r += pixes[i] * gaussMatrix[j + radius];
  60. g += pixes[i + 1] * gaussMatrix[j + radius];
  61. b += pixes[i + 2] * gaussMatrix[j + radius];
  62. // a += pixes[i + 3] * gaussMatrix[j];
  63. gaussSum += gaussMatrix[j + radius];
  64. }
  65. }
  66. i = (y * width + x) * 4;
  67. pixes[i] = r / gaussSum;
  68. pixes[i + 1] = g / gaussSum;
  69. pixes[i + 2] = b / gaussSum;
  70. }
  71. }
  72. //end
  73. return imgData;
  74. }
  1. 刮刮乐

原理:将canvas背景用图片设置,canvas内容用刮刮乐灰色效果,然后鼠标按下、鼠标移动、鼠标抬起,完成清除canvas内容的操作

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Document</title>
  8. </head>
  9. <body>
  10. <canvas id="canv" width="400" height="400"></canvas>
  11. <script>
  12. var oCanvas = document.getElementById('canv'),
  13. ctx = oCanvas.getContext('2d'),
  14. w = oCanvas.width,
  15. h = oCanvas.height,
  16. lastPiont = {},
  17. nowPoint = {};
  18. function init(){
  19. ctx.fillStyle = '#ccc';
  20. ctx.fillRect(0, 0,w, h);
  21. ctx.globalCompositeOperation = 'destination-out';
  22. var img = new Image();
  23. img.src = './1.jpeg';
  24. img.onload = function(){
  25. oCanvas.style.backgroundImage = 'url(' + img.src + ')';
  26. oCanvas.addEventListener('mousedown', downFunc, false);
  27. }
  28. }
  29. init();
  30. function downFunc(e){
  31. lastPiont.x = e.clientX - oCanvas.offsetLeft;
  32. lastPiont.y = e.clientY - oCanvas.offsetTop;
  33. oCanvas.addEventListener('mousemove', moveFunc, false);
  34. document.addEventListener('mouseup', upFunc, false);
  35. }
  36. function moveFunc(e){
  37. nowPoint.x = e.clientX - oCanvas.offsetLeft;
  38. nowPoint.y = e.clientY - oCanvas.offsetTop;
  39. ctx.beginPath();
  40. ctx.fillStyle = 'red';
  41. ctx.lineWidth = 40;
  42. ctx.lineCap = 'round';
  43. ctx.moveTo(lastPiont.x, lastPiont.y);
  44. ctx.lineTo(nowPoint.x, nowPoint.y);
  45. ctx.stroke();
  46. ctx.arc(nowPoint.x, nowPoint.y, 20, 0, Math.PI *2);
  47. ctx.closePath();
  48. ctx.fill();
  49. lastPiont.x = nowPoint.x;
  50. lastPiont.y = nowPoint.y;
  51. }
  52. function upFunc(){
  53. oCanvas.removeEventListener('mousemove', moveFunc, false);
  54. document.removeEventListener('mouseup', upFunc, false);
  55. clearCanvas();
  56. }
  57. function clearCanvas(){
  58. var d = ctx.getImageData(0, 0, w, h),
  59. c = 0,
  60. len = d.data.length;
  61. for(var i = 0; i < len; i += 4){
  62. if(d.data[i] === 0){
  63. c++;
  64. }
  65. }
  66. if(c > len/4 *0.7){
  67. ctx.clearRect(0, 0, w, h);
  68. }
  69. }
  70. </script>
  71. </body>
  72. </html>

发表评论

表情:
评论列表 (有 0 条评论,447人围观)

还没有评论,来说两句吧...

相关阅读

    相关 canvas应用----

    最近在学习html5,为了更好地学习和帮助其他人我决定把我写过的案例写下来~~ 先说一下刮刮乐这个程序实现的注意点 材料:一张图片和canvas画布 在html