2016-05-16 12 views
0

私はキャンバスのビットマップを描き、無着色領域をパーセンテージで計算しようとしています。 私はいくつかの方法を見つけましたが、ピクセルを計算していません。画面を描画し終わったら、私は小さな領域を残しました。アンドロイドキャンバス%で領域の色付きピクセルを計算する

public float percentTransparent(Bitmap bm, int scale) { 

    final int width = bm.getWidth(); 
    final int height = bm.getHeight(); 

    // size of sample rectangles 
    final int xStep = width/scale; 
    final int yStep = height/scale; 

    // center of the first rectangle 
    final int xInit = xStep/2; 
    final int yInit = yStep/2; 

    // center of the last rectangle 
    final int xEnd = width - xStep/2; 
    final int yEnd = height - yStep/2; 

    int totalTransparent = 0; 

    for(int x = xInit; x <= xEnd; x += xStep) { 
     for(int y = yInit; y <= yEnd; y += yStep) { 
      if (bm.getPixel(x, y) == Color.TRANSPARENT) { 
       totalTransparent++; 
      } 
     } 
    } 
    return ((float)totalTransparent)/(scale * scale); 

} 

これは私が見つけた方法です。

答えて

1

私はこれらすべてのプレスケーリングをやっているのか分かりませんが、従来の数学ではまず必要な数を計算してから、必要な結果にスケーリングします。事前スケーリングはエラーを簡単に引き起こす可能性があります。このような何か:

public float percentTransparent(Bitmap bm, float scale) { 

    int width = bm.getWidth(); 
    int height = bm.getHeight(); 
    int area = width * height; 
    int totalTransparent = 0; 

    for(int x = 0; x <= width; x ++) { 
     for(int y = 0; y <= height; y ++) { 
      if (bm.getPixel(x, y) == Color.TRANSPARENT) { 
       totalTransparent++; 
      } 
     } 
    } 

    // so here we know for sure that `area` is the total pixels 
    // and `totalTransparent` are the total pixels not colored 
    // so to calculate percentage is a simple percentage 

    float percTransparent = 
     ((float)totalTransparent)/
     ((float)area) 

    // at the end you can scale your final result 
    ... return something with `percTransparent` and `scale` 

} 

PS:場合には、この処理は、あなたがより速く、数回の処理を達成しますのrenderScriptを使用して(それが実現するのは非常に複雑になることができさえなた)を完了する時間がかかりすぎています。

+0

ありがとうございましたが、多くの時間がかかりました –

+0

信頼できる計算が必要な場合は、すべてのピクセルをスキャンしてすべてのピクセルをスキャンする必要があります。しかし、それは私が最後に観測を追加した理由です.RenderScriptを使用すると、はるかに高速にすることができます – Budius

関連する問題