美文网首页
4.canvas ImageData对象

4.canvas ImageData对象

作者: 琉璃_xin | 来源:发表于2019-04-11 13:39 被阅读0次

    1.创建一个ImageData对象

    • var myImageData = ctx.createImageData(width,height)

      所有像素被预设为透明黑 image.png
    • var myImageData = ctx.createImageData(another ImageData)
      创建一个被anotherImageData对象指定的相同像素的ImageData对象。这个新的对象像素全部被预设为透明黑。这个并非复制了图片数据

    2.得到场景像素数据

    var myImageData = ctx.getImageData(left, top, width, height);

      let canvas = document.getElementById('canvas');
      let ctx = canvas.getContext('2d');
      let sun = new Image();
      sun.onload = function () {
        ctx.drawImage(sun,0,0);
        //imageData
        let imageData = ctx.getImageData(0,0,canvas.width,canvas.height);
        console.log(imageData)
    
      }
      sun.src = './Canvas_sun.png';
    
    image.png
    data属性返回一个 Uint8ClampedArray,它可以被使用作为查看初始像素数据。每个像素用4个1bytes值(按照红,绿,蓝和透明值的顺序; 这就是"RGBA"格式) 来代表。每个颜色值部份用0至255来代表。每个部份被分配到一个在数组内连续的索引,左上角像素的红色部份在数组的索引0位置。像素从左到右被处理,然后往下,遍历整个数组。

    如何通过具体位置信息读取其像素值呢?
    (200,50) 位置处的蓝色像素信息:
    let blue = imageData.data[((50-1)*imageData.width + (200-1))*4 - 1 + 3];
    根据行、列读取某像素点的R/G/B/A值的公式:
    imageData.data[((行数-1)*imageData.width + (列数-1))*4 - 1 + 1/2/3/4];

      let img = new Image();
      img.src = './rhino.jpg';
      let canvas = document.getElementById('canvas');
      let ctx = canvas.getContext('2d');
      img.onload = function() {
        ctx.drawImage(img, 0, 0);
        img.style.display = 'none';
      };
      let color = document.getElementById('color');
      function pick(event) {
        let x = event.layerX;
        let y = event.layerY;
        let pixel = ctx.getImageData(x, y, 1, 1);
        let data = pixel.data;
        console.log(data)
        let rgba = 'rgba(' + data[0] + ',' + data[1] +
                  ',' + data[2] + ',' + (data[3] / 255) + ')';
        color.style.background =  rgba;
        color.textContent = rgba;
      }
      canvas.addEventListener('mousemove', pick);
    
    image.png

    3.写入像素数据

    ctx.putImageData(myImageData, dx, dy);
    dx和dy参数表示你希望在场景内左上角绘制的像素数据所得到的设备坐标

      let canvas = document.getElementById('canvas');
      let ctx = canvas.getContext('2d');
      let sun = new Image();
      sun.onload = function () {
        ctx.drawImage(sun,0,0);
        //imageData
        let imageData = ctx.getImageData(0,0,canvas.width,canvas.height);
        
        //putImageData
        ctx.putImageData(imageData,200,200)
    
      }
      sun.src = './Canvas_sun.png';
    
    image.png

    可以将数据操作后再放入场景(将上述图形色值取反):

      let canvas = document.getElementById('canvas');
      let ctx = canvas.getContext('2d');
      let sun = new Image();
      sun.onload = function () {
        ctx.drawImage(sun,0,0);
        //imageData
        let imageData = ctx.getImageData(0,0,canvas.width,canvas.height);
        
        for (let i = 0;i < imageData.data.length; i += 4){
          imageData.data[i]     = 255 - imageData.data[i];     // red
          imageData.data[i + 1] = 255 - imageData.data[i + 1]; // green
          imageData.data[i + 2] = 255 - imageData.data[i + 2]; // blue
        }
        //putImageData
        ctx.putImageData(imageData,200,200)
    
      }
      sun.src = './Canvas_sun.png';
    
    image.png

    4.保存为图片

    canvas.toDataURL()

    相关文章

      网友评论

          本文标题:4.canvas ImageData对象

          本文链接:https://www.haomeiwen.com/subject/friziqtx.html