zoukankan      html  css  js  c++  java
  • canvas和svg

    1. canvas进行像素级操作

    获取一块像素 => "数组"; let imageData = getImageData(x,y,w,h) (imageData是一个对象,包括'data', 'width', 'height' 三个属性)
    设置一块像素 => "数组"->Canvas; putImageData(imageData)
    创建一块像素 => 空白数组

    一个像素占4位:rgba
    r 0~255
    g 0~255
    b 0~255
    a 0~255

    应用:比如将图片色调点黄

     <script>
        window.onload=function (){
          let oC=document.getElementById('c1');
          let gd=oC.getContext('2d');
          let W=oC.width,H=oC.height;
    
          let oImg=new Image();
          oImg.src='http://127.0.0.1:8080/www/2.jpg';
    
          oImg.onload=function (){
            gd.drawImage(oImg, 0, 0);
    
            let imageData=gd.getImageData(0, 0, W, H);
    
            //黄=>扔掉蓝色
            for(let r=0;r<H;r++){
              for(let c=0;c<W;c++){
                //(r*W+c)*4+0       =>    red
                //(r*W+c)*4+1       =>    green
                //(r*W+c)*4+2       =>    blue
                //(r*W+c)*4+3       =>    alpha
                imageData.data[(r*W+c)*4+2]=0;
              }
            }
    
            //
            gd.putImageData(imageData, 0, 0);
          };
        };
        </script>

     2.video处理,对视频的每一帧进行处理

    <script>
        window.onload=function (){
          let oV=document.getElementById('v1');
          let oC=document.getElementById('c1');
          let gd=oC.getContext('2d');
    
          let W=oC.width,H=oC.height;
    
          requestAnimationFrame(next);
    
          function next(){
            gd.drawImage(oV, 0, 0);
    
            //
            let imageData=gd.getImageData(0, 0, W, H);
            let data=imageData.data;
    
            for(let r=0;r<H;r++){
              for(let c=0;c<W;c++){
                data[(r*W+c)*4+0]=data[(r*W+c)*4+1]=data[(r*W+c)*4+2]=
                (data[(r*W+c)*4+0]+data[(r*W+c)*4+1]+data[(r*W+c)*4+2])/3;
              }
            }
    
            gd.putImageData(imageData, 0, 0);
    
            requestAnimationFrame(next);
          }
        };
        </script>
      </head>
      <body>
        <video src="movie.ogg" id="v1" autoplay loop style="display:none;"></video>
        <canvas id="c1" width="320" height="240"></canvas>
      </body>

    3. 解决canvas在Mac下不清晰的问题

    原理:根据设备的像素比,将对应的canvas的宽、高乘以相应的window.devicePixelRatio; 然后通过style限制canvas的大小]// 获取getPixelRatio: (context) => {

        let backingStore = context.backingStorePixelRatio ||
          context.webkitBackingStorePixelRatio ||
          context.mozBackingStorePixelRatio ||
          context.msBackingStorePixelRatio ||
          context.oBackingStorePixelRatio ||
          context.backingStorePixelRatio || 1;
    
        return (window.devicePixelRatio || 1) / backingStore;
      }
    
    // 这里是d3-force的业务组件对应代码
    this.canvas.attr('width', options.width)
    .attr('height', options.height)
    
    // dpr
    // 也可用d3.style(); 如this.canvas.style('width', '100px')
    this.ele.style.width = options.width/this.pixelRatio + 'px' this.ele.style.height = options.height/this.pixelRatio + 'px'
  • 相关阅读:
    数组_leetcode283
    数组_leetcode438
    数组_leetcode215
    数组_leetcode167
    数组_leetcode209
    数组_leetcode88
    数组_leetcode80
    数组_leetcode76
    数组_leetcode75
    数组_leetcode27
  • 原文地址:https://www.cnblogs.com/luguiqing/p/10809988.html
Copyright © 2011-2022 走看看