2017-07-31 62 views
0
public void floodFill(Bitmap bitmap, Point point, int i, int j) { 
    int k = bitmap.getWidth(); 
    int l = bitmap.getHeight(); 
    if (i != j) { 
     LinkedList linkedlist = new LinkedList(); 
     do { 
      int i1 = point.x; 
      int j1; 
      for (j1 = point.y; i1 > 0 && !isBlack(bitmap.getPixel(i1 - 1, j1),j); i1--) { 
      } 
      boolean flag = false; 
      boolean flag1 = false; 
      while (i1 < k && !isBlack(bitmap.getPixel(i1, j1), j)) { 
       bitmap.setPixel(i1, j1, j); //main 

       if (!flag && j1 > 0 && !isBlack(bitmap.getPixel(i1, j1 - 1), j)) { 
        linkedlist.add(new Point(i1, j1 - 1)); 
        flag = true; 
       } else if (flag && j1 > 0 && isBlack(bitmap.getPixel(i1, j1 - 1), j)) { 
        flag = false; 
       } 

       if (!flag1 && j1 < l - 1 && !isBlack(bitmap.getPixel(i1, j1 + 1), j)) { 
        linkedlist.add(new Point(i1, j1 + 1)); 
        flag1 = true; 
       } else if (flag1 && j1 < l - 1 && isBlack(bitmap.getPixel(i1, j1 + 1), j)) { 
        flag1 = false; 
       } 

       i1++; 
      } 

      point = (Point) linkedlist.poll(); 
     } while (point != null); 
    } 
} 

private boolean isBlack(int i, int j) { 
    while (Color.red(i) == Color.green(i) && 
      Color.green(i) == Color.blue(i) && 
      Color.red(i) < 100 || i == j) { 
     return true; 
    } 
    return false; 
} 

我使用此代碼來填充圖像的任何部分點擊各種顏色的形狀。它工作得很好,不會在邊界留下白色邊緣,但問題在於它的工作太慢。我怎麼能加快速度?洪水填充算法運行緩慢,我怎麼能加快這個算法?

+0

你可以使用JNI算法您的應用程序。哪個性能比java更快 –

回答

0

你可以嘗試不同的方式速度變薄了:

  1. 更改算法本身
  2. 做出可能加快速度有點小optiomizations。

一如既往優化: 在每次優化嘗試之前和之後剖析代碼,看看您是否獲得了任何東西。

相關的1
如果你有大的黑色區域,你可以嘗試:

  1. 按比例縮小圖像,並填補了縮小的圖像(但不達標的邊界),並應用填充在大矩形到原始圖像。

  2. 填充原始圖像中旁充填在步驟1中(到窗臺邊和所有細節)

相關2.

  • 大矩形的一個也許你可以在圖像周圍添加一個1像素的黑色邊框。 這樣你可以刪除所有邊境檢查:

    public void floodFill(Bitmap bitmap, Point point, int i, int j) { 
    int k = bitmap.getWidth(); 
    int l = bitmap.getHeight(); 
    if (i != j) { 
        LinkedList linkedlist = new LinkedList(); 
        do { 
         int i1 = point.x; 
         int j1; 
         for (j1 = point.y; i1 > 0 && !isBlack(bitmap.getPixel(i1 - 1, j1),j); i1--) { 
         } 
         boolean flag = false; 
         boolean flag1 = false; 
         while (i1 < k && !isBlack(bitmap.getPixel(i1, j1), j)) { 
          bitmap.setPixel(i1, j1, j); //main 
    
          if (!flag && !isBlack(bitmap.getPixel(i1, j1 - 1), j)) { 
           linkedlist.add(new Point(i1, j1 - 1)); 
           flag = true; 
          } else if (flag && isBlack(bitmap.getPixel(i1, j1 - 1), j)) { 
           flag = false; 
          } 
    
          if (!flag1 && !isBlack(bitmap.getPixel(i1, j1 + 1), j)) { 
           linkedlist.add(new Point(i1, j1 + 1)); 
           flag1 = true; 
          } else if (flag1 && j1 < l - 1 && isBlack(bitmap.getPixel(i1, j1 + 1), j)) { 
           flag1 = false; 
          } 
          i1++; 
         } 
    
         point = (Point) linkedlist.poll(); 
        } while (point != null); 
    } 
    
    // maybe even reorder the conditions: 
    // If conditions are equal hard to compute: 
    // for || always do the mostlikely satisfied condition to the front 
    // for && always do the mostlikely to fail condition to the front 
    
    
    
    private boolean isBlack(int i, int j) { 
        float r= Color.red(i); 
        float g= Color.green(i); 
        float b= Color.blue(i); 
        retrun (r == g && g == b && r < 100 || i == j) ; 
    } 
    
+0

我有同樣的問題,這很好,你已經在isBlack(...)方法中完成了,但是仍然需要更快地填充該區域。我認爲我們應該把隊列的功能放在它裏面,那麼表現可能會更好,但是不知道該怎麼做, 就像這個線程一樣https://stackoverflow.com/questions/40895477/white-spaces -left-in-coloring-using-queuelinearfloodfillalgorithm 它速度很快,但它留下了一些空白區域,這是我沒有使用它,你能否將這兩者相互嵌入以獲得最佳洪水填充算法。謝謝 –