2012-01-31 82 views
2

我需要获取画布中透明/不透明像素的比例。做这个的最好方式是什么?HTML5获取画布中alpha像素的数量

UPDATE: 基于下面的帖子中,我结束了写这个代码:

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; 
} 

回答

7

如前所述,计数个体o帕克像素是做到这一点的唯一方法。

以下可能比其他答案中显示的伪代码更快。 尽管有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

这比我的伪代码快。最后一行是否指'alphaPixels'? – paislee 2012-02-01 19:07:43

+0

@paislee - 是的,谢谢你发现 – andrewmu 2012-02-01 20:17:17

1

当谈到像素的画布上,你别无选择,只能抓住他们所有getImageData() - .data你结果是以RGBA顺序的数据的字节数组。不要期望从这个伟大的表现,但如果这是你必须做的事情......

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 

参考