zoukankan      html  css  js  c++  java
  • HTML5 组件Canvas实现图像灰度化

      新建一个html页面,在body tag之间加入

    <canvas id="myCanvas" >Gray Filter</canvas>  

      添加一段最简单的JavaScript 脚本

    <pre name="code" class="javascript">window.onload = function() {
      var canvas = document.getElementById("myCanvas");
    <span style="white-space:pre">  </span>// TODO: do something here
    }

      从Canvas对象获取绘制对象上下文Context的代码如下:

    var context = canvas.getContext("2d");

      在html页面中加入一幅图像的html代码如下

    <img id="imageSource" src="hanjiaren.jpg" alt="Canvas Source" />

      从html img对象中获取image 对象的javascript代码如下:

    var image = document.getElementById("imageSource");

      将得到的图像绘制在Canvas对象中的代码如下:

    context.drawImage(image, 0, 0);

      从Canvas对象中获取图像像素数据的代码如下:

    var canvasData = context.getImageData(0, 0, canvas.width, canvas.height);

      读取像素值与实现灰度计算的代码如下:

      for ( var x = 0; x < canvasData.width; x++) {
        for ( var y = 0; y < canvasData.height; y++) {

          // Index of the pixel in the array
          var idx = (x + y * canvasData.width) * 4;
          var r = canvasData.data[idx + 0];
                var g = canvasData.data[idx + 1];
                var b = canvasData.data[idx + 2];
                
                // calculate gray scale value
                var gray = .299 * r + .587 * g + .114 * b;
                
          // assign gray scale value
          canvasData.data[idx + 0] = gray; // Red channel
          canvasData.data[idx + 1] = gray; // Green channel
          canvasData.data[idx + 2] = gray; // Blue channel
          canvasData.data[idx + 3] = 255; // Alpha channel
            
          // add black border
          if(x < 8 || y < 8 || x > (canvasData.width - 8) || y > (canvasData.height - 8)) 
          {
            canvasData.data[idx + 0] = 0;
            canvasData.data[idx + 1] = 0;
            canvasData.data[idx + 2] = 0;
          }
        }
      }

      其中计算灰度公式为 gray color = 0.299 × red color + 0.578 × green color + 0.114 * blue color

      读取出来的像素值顺序为RGBA 分别代表red color, green color, blue color, alpha channel

      处理完成的数据要重新载入到Canvas中。代码如下:

    context.putImageData(canvasData, 0, 0);

      程序最终的效果如下:

      

      完全源代码如下:

    <html>
    <head>
    <script>
      window.onload = function() {
        var canvas = document.getElementById("myCanvas");
        var image = document.getElementById("imageSource");
        
        // re-size the canvas deminsion
        canvas.width  = image.width;
        canvas.height = image.height;
        
        // get 2D render object
        var context = canvas.getContext("2d");
        context.drawImage(image, 0, 0);
        var canvasData = context.getImageData(0, 0, canvas.width, canvas.height);
        alert(canvasData.width.toString());
        alert(canvasData.height.toString
    ());
        
        // gray filter
        for ( var x = 0; x < canvasData.width; x++) {
          for ( var y = 0; y < canvasData.height; y++) {

            // Index of the pixel in the array
            var idx = (x + y * canvasData.width) * 4;
            var r = canvasData.data[idx + 0];
                var g = canvasData.data[idx + 1];
                var b = canvasData.data[idx + 2];
                
                // calculate gray scale value
                var gray = .299 * r + .587 * g + .114 * b;
                
            // assign gray scale value
            canvasData.data[idx + 0] = gray; // Red channel
            canvasData.data[idx + 1] = gray; // Green channel
            canvasData.data[idx + 2] = gray; // Blue channel
            canvasData.data[idx + 3] = 255; // Alpha channel
            
            // add black border
            if(x < 8 || y < 8 || x > (canvasData.width - 8) || y > (canvasData.height - 8)) 
            {
              canvasData.data[idx + 0] = 0;
              canvasData.data[idx + 1] = 0;
              canvasData.data[idx + 2] = 0;
            }
          }
        }
        context.putImageData(canvasData, 0, 0); // at coords 0,0
      };
    </script>
    </head>
    <body>
      <h2>Hello World!</h2>
      <img id="imageSource" src="hanjiaren.jpg" alt="Canvas Source" />
      <br />
      <canvas id="myCanvas" >Gray Filter</canvas>
    </body>
    </html>

      代码中的文件可以替换任意你想要看到的图片文件

      HTML5, 原来如此神奇。程序在google浏览器中测试通过,

      最后的忠告,千万不要在本地尝试运行上面的代码,google浏览器的安全检查会自动阻止从浏览器中读写非domain的文件

      最好在tomcat或者任意个web container的server上发布以后从google浏览器查看效果即可。

      本文来自jia20003的博客,原文地址:http://blog.csdn.net/jia20003/article/details/7228464

  • 相关阅读:
    福建工程学院第十四届ACM校赛B题题解
    2018 ACM-ICPC青岛现场赛 B题 Kawa Exam 题解 ZOJ 4059
    联合周赛第二场 我在哪?题解
    维修数列 Splay(这可能是我写过最麻烦的题之一了。。。用平衡树维护dp。。。丧心病狂啊。。。。)
    虚树入门!世界树!
    御坂御坂题解(出自北航校赛) 约瑟夫环问题高效解决方案
    网络流24题! 开始!题解!
    AFO
    【模板库】减维的模板库【停更】
    【组合数学】Educational Codeforces Round 83 (Rated for Div. 2) D题
  • 原文地址:https://www.cnblogs.com/top5/p/3033041.html
Copyright © 2011-2022 走看看