androidcanvas计算区域彩色像素的百分比



我画了一个画布位图,并试图计算未着色区域的百分比。我找到了一些方法,但它们没有计算像素,当我画完屏幕,留下了一个很小的未覆盖区域时,我完成了该方法。

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

这就是我找到的方法。

我不知道为什么要进行所有这些预缩放,但传统的数学方法是先计算出所需的数字,然后将其缩放到所需的结果。预缩放很容易导致错误。类似这样的东西:

 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完成此处理需要太长时间(即使实现起来也可能相当复杂),则处理速度会快几倍。

最新更新