【问题标题】:how to set the alpha channel in canvas while grayscaling如何在灰度化时在画布中设置 Alpha 通道
【发布时间】:2015-08-26 06:22:45
【问题描述】:

我正在使用 HTML canvas 对图像进行灰度化,我不想只是平均它。所以我用这个功能

  var imageData = ctx.getImageData(0,0,canvas.width, canvas.height);
  var data= imageData.data
    for (var i = 0; i < data.length; i += 4) {
      var grayscale = (data[i]*0.2126 + data[i +1]*0.7152 + data[i +2])*0.0722;
      data[i]     = grayscale; // red
      data[i + 1] = grayscale; // green
      data[i + 2] = grayscale; // blue
    }
    ctx.putImageData(imageData, 0, 0);
} 

但问题是,如果图片有白色背景,它将变成黑色。所以尝试了data[i + 3] = 255; 的 alpha 通道,但这将整个画布变成了黑色。

我做错了什么?

【问题讨论】:

    标签: javascript html canvas grayscale


    【解决方案1】:

    问题出在这一行:

    var grayscale = (data[i]*0.2126 + data[i +1]*0.7152 + data[i +2])*0.0722;
    

    注意最后一个常数乘以它左边的整个表达式,而它应该只乘以data[i+2]

    var grayscale = data[i]*0.2126 + data[i + 1]*0.7152 + data[i + 2]*0.0722;
    

    jsfiddle

    【讨论】:

    • FML,我是菜鸟!谢谢!所以我想知道是否有一种方法可以在画布中只分离一个通道。类似于 IMagick convert myfile.jpg -channel B -separate myfileR.jpg
    • 嗯,使用和上面一样的代码,把不需要的频道设置为0即可。
    • 好的,但是现在如果我再次对其进行灰度化,它会将白色空间变成黑色
    • 如何将通道设置为0,同时保持白色背景为白色?
    • @PaulBernhardWagner 那是不可能的——如果你从一张白色图片中过滤掉蓝色通道,你会得到一张完全蓝色的图片。请将您的代码发布在 jsfiddle 或更好的版本中 - 打开另一个问题。
    猜你喜欢
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 2019-04-21
    • 2013-02-01
    • 2022-12-20
    • 2019-01-13
    相关资源
    最近更新 更多