2

キャンバスの透明/不透明ピクセルの比率を取得する必要があります。これを行うための最良の方法は何ですか?

更新:以下の投稿に基づいて、私はこのコードを書くことになりました:

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

3 に答える 3

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);
}
于 2012-02-01T16:40:05.500 に答える
1

キャンバス上のピクセルに関しては、すべてを取得する以外に選択肢はありませんgetImageData().data結果は RGBA 順のデータのバイト配列です。これから素晴らしいパフォーマンスを期待しないでください、しかしそれがあなたがしなければならないことなら...

于 2012-01-31T22:20:19.810 に答える
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

参照

于 2012-01-31T22:30:25.763 に答える