【问题标题】:Determining the brightness of an image using canvas使用画布确定图像的亮度
【发布时间】:2018-07-09 20:45:05
【问题描述】:

我有一个函数可以循环遍历图像的像素,以确定图像的平均“亮度”为 0(黑色)- 255(白色)之间的数字.

问题是在测试过程中,我发现虽然全黑的图像 (#000000) 会正确返回 0,但全白的图像 (#FFFFFF) 会返回一个围绕 的数字>200 而不是 255。我错过了什么吗?

这是我的功能,任何帮助将不胜感激!

function getBrightness(imageSrc, callback) {
  const img = document.createElement("img");
  img.src = imageSrc;
  img.style.display = "none";
  document.body.appendChild(img);
  let colorSum = 0;

    img.onload = function() {
      const canvas = document.createElement("canvas");
      canvas.width = this.width;
      canvas.height = this.height;
      const ctx = canvas.getContext("2d");
      ctx.drawImage(this, 0, 0);

      const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
      const data = imageData.data;
      let r, g, b, avg;

      for(let x=0, len=data.length; x<len; x+=4) {
        r = data[x];
        g = data[x+1];
        b = data[x+2];
        avg = Math.floor((r+g+b) / 3);
        colorSum += avg;
      }

      const brightness = Math.floor(colorSum / (this.width * this.height));
      callback(brightness);
    }
}

【问题讨论】:

标签: javascript canvas getimagedata


【解决方案1】:

对不起,但正如下面的 sn-p 所证明的那样,您提到的图像的结果是 255。 也许您想查看您在测试中使用的文件?您可能使用了错误的文件...

function getBrightness(imageSrc, callback) {
  const img = document.createElement("img");
  img.src = imageSrc;
  img.crossOrigin = 'anonymous';
  img.style.display = "none";
  document.body.appendChild(img);
  let colorSum = 0;

    img.onload = function() {
      const canvas = document.createElement("canvas");
      canvas.width = this.width;
      canvas.height = this.height;
      const ctx = canvas.getContext("2d");
      ctx.drawImage(this, 0, 0);

      const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
      const data = imageData.data;
      let r, g, b, avg;

      for(let x=0, len=data.length; x<len; x+=4) {
        r = data[x];
        g = data[x+1];
        b = data[x+2];
        avg = Math.floor((r+g+b) / 3);
        colorSum += avg;
      }

      const brightness = Math.floor(colorSum / (this.width * this.height));
      callback(brightness);
    }
};


getBrightness(
    'https://upload.wikimedia.org/wikipedia/commons/thumb/7/70/Solid_white.svg/768px-Solid_white.svg.png', 
    (b)=>console.log(b));

我刚刚添加了img.crossOrigin = 'anonymous'; 行,以避免出现 cors 安全消息。

【讨论】:

  • 问题原来是我的网站将图像裁剪为圆形 png,而圆形之外的区域被解释为黑色。谢谢大家的帮助!
猜你喜欢
  • 2011-06-20
  • 2011-04-23
  • 2020-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
  • 1970-01-01
  • 2018-10-24
相关资源
最近更新 更多