HTML5获取画布中的alpha像素数

时间:2012-01-31 22:14:58

标签: html5 canvas alpha alpha-transparency

我需要在画布中获得透明/不透明像素的比例。这样做的最佳方式是什么?

更新: 基于以下帖子,我最终编写了这段代码:

function getNumberOfAlphaPixels(can) {
    var step = 200; //We skip 200 pixels to make it work faster
    var ctx = can.getContext('2d');
    var imgd = ctx.getImageData(0, 0, can.width, can.height);
    var pix = imgd.data;
    var alphaPixelsNum = 0;

    for (var i = 0; i < pix.length; i += 4*step) {
        if (pix[i+3] == 0) {
            alphaPixelsNum += step;
        }
    }

    return alphaPixelsNum;
}

3 个答案:

答案 0 :(得分:7)

如上所述,计算单个不透明像素是唯一的方法。

以下可能比其他答案中显示的伪代码更快。 尽管有JIT跟踪/代码分析,但它确实有助于说明基本的低级别操作。

function alphaRatio(ctx) {
  var alphaPixels = 0;

  var data = ctx.getImageData(0,0, ctx.canvas.width,ctx.canvas.height).data;
  for(var i=3; i<data.length; i+=4) {
    if(data[i] > 0) alphaPixels++;
  }

  return alphaPixels / (ctx.canvas.width * ctx.canvas.height);
}

答案 1 :(得分:1)

说到画布上的像素,你别无选择,只能用getImageData()抓取它们 - 结果中的.data是RGBA顺序的数据的字节数组。不要指望这会有很好的表现,但如果那就是你要做的......

答案 2 :(得分:1)

向上计数(伪代码):

var alphaPixels, alpha, totalPixels

for each pixel (x, y)
    alpha = imageData.data[((y*(imageData.width*4)) + (x*4)) + 3] // <- real code
    //                                 offset to alpha channel ^
    if (alpha > 0)
        alphaPixels++

return alphaPixels / totalPixels

<强>参考