2016-05-16 84 views
0

我繪製了一個畫布位圖並試圖計算無色區域的百分比。 我發現了一些方法,但他們沒有計算像素,當我完成繪製屏幕並且我已經離開了一個很小的未知區域時,該方法寫下了我完成的。android canvas以百分比計算區域彩色像素

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