示例5 - canvas对图片操作—灰度与反相颜色

549 阅读1分钟

html:

  <body>
    <canvas id="c" width="300" height="250"></canvas>
    <label
      ><input
        type="radio"
        value="颜色翻转"
        name="color"
        id="c1"
      />颜色翻转</label
    >
    <label><input value="灰度" type="radio" name="color" id="" />灰度 </label>
    <label><input value="正常" type="radio" name="color" id="" />正常</label>
  </body>

图片素材:

pic.png

js:

    var img = new Image();
    img.crossOrigin = 'anonymous';
    img.src = '../imgs/pic.png';

    const c = document.getElementById('c');
    const ctx = c.getContext('2d');

    img.onload = function () {
      ctx.drawImage(img, 0, 0);
    };

    var original = () => {
      ctx.drawImage(img, 0, 0);
    };

    // 颜色翻转
    var invert = () => {
      ctx.drawImage(img, 0, 0);
      const imageData = ctx.getImageData(0, 0, c.width, c.height);
      const data = imageData.data;

      for (var i = 0; i < data.length; i += 4) {
        data[i] = 255 - data[i]; // red
        data[i + 1] = 255 - data[i + 1]; // green
        data[i + 2] = 255 - data[i + 2]; // blue
      }

      ctx.putImageData(imageData, 0, 0);
    };

    // 灰度
    var grayscale = () => {
      ctx.drawImage(img, 0, 0);
      const imageData = ctx.getImageData(0, 0, c.width, c.height);
      const data = imageData.data;

      for (var i = 0; i < data.length; i += 4) {
        var avg = (data[i] + data[i + 1] + data[i + 2]) / 3;
        data[i] = avg; // red
        data[i + 1] = avg; // green
        data[i + 2] = avg; // blue
      }

      ctx.putImageData(imageData, 0, 0);
    };

    const inputs = document.querySelectorAll('[name=color]');
    for (const input of inputs) {
      input.addEventListener('change', function (e) {
        switch (e.target.value) {
          case '颜色翻转':
            return invert();
          case '灰度':
            return grayscale();
          default:
            return original();
        }
      });
    }

效果:

image.png

image.png

大致思路:

就是取出当前图片的每个像素点的rgb值,对其进行取平均值和取反值得操作。