图片灰度化的实现
一、使用 CSS 实现
使用 CSS 的 filter 的 grayscale(灰度)和 brightness(亮度)属性设置,例如:
img {
  filter: grayscale(1) brightness(1.5);
}
效果如下:


二、使用 Canvas 实现
使用 Canvas 实现图片灰度化,需要操作图片的像素数据。下面通过 getImageData 和 putImageData 实现图片灰度化:
HTML 文件:
<button id="grayscalebtn">点击一键灰度化</button>
<div>
  <div>
    <p>img 原图</p>
    <img id="previewContainer" width="200" height="200" />
  </div>
  <div>
    <p>canvas 容器</p>
    <canvas id="canvas" width="200" height="200"></canvas>
  </div>
</div>
JS 文件:
const image = document.querySelector("#previewContainer");
const canvas = document.querySelector("#canvas");
// 将远程拿到的图片渲染到 canvas
fetch("https://avatars3.githubusercontent.com/u/4220799")
  .then((response) => response.blob())
  .then((blob) => {
    // 将 Blob 对象生成一个 URL 给 img 使用
    const objectURL = URL.createObjectURL(blob);
    image.src = objectURL;
    image.onload = () => {
      // 绘制图像
      draw();
    };
  });
// 点击按钮触发图片灰度化
function draw() {
  const ctx = canvas.getContext("2d");
  ctx.drawImage(image, 0, 0, 200, 200);
  // 获取原图
  const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
  // 获取原图存有每个像素 rgba 值的数组
  const colorDataArr = imageData.data;
  
  const grayscale = function () {
    // 遍历每个像素并灰度化
    for (let i = 0; i < colorDataArr.length; i += 4) {
      // 对应像素上的 rgb 平均值及为该像素的灰度值
      const gray = (colorDataArr[i] + colorDataArr[i + 1] + colorDataArr[i + 2]) / 3;
      colorDataArr[i] = gray;      // red
      colorDataArr[i + 1] = gray;  // green
      colorDataArr[i + 2] = gray;  // blue
    }
    ctx.putImageData(imageData, 0, 0);
  };
  const grayscalebtn = document.querySelector("#grayscalebtn");
  grayscalebtn.addEventListener("click", grayscale);
}
实现效果:

这里用 draw() 方法把获取的图像绘制到页面的 Canvas 容器中,同时为灰度化按钮绑定监听事件。
当用户点击灰度化按钮时,将会触发灰度化处理函数,在该函数内部会对通过 ctx.getImageData() 方法获取的图片像素进行灰度化处理,处理完成后再通过 ctx.putImageData() 方法把处理过的像素数据更新到 Canvas 上。