2015-09-05 38 views
1

我在java中製作一個像素藝術編輯器,只是爲了好玩,而我遇到了一個問題。當我嘗試填充函數時發生問題。這裏是代碼如何製作照片編輯器的填充方法?

private void fill(int x, int y){ 
    Color beforeColor = img[x][y]; 
    img[x][y] = foregroundColor; 

    if(x-1 >= 0){ 
     if(img[x-1][y] == beforeColor){ 
      fill(x-1, y); 
     } 
    } 

    if(x+1 >= 0){ 
     if(img[x+1][y] == beforeColor){ 
      fill(x+1, y); 
     } 
    } 

    if(y-1 >= 0){ 
     if(img[x][y-1] == beforeColor){ 
      fill(x, y-1); 
     } 
    } 

    if(y+1 >= 0){ 
     if(img[x][y+1] == beforeColor){ 
      fill(x, y+1); 
     } 
    } 
} 

img是awt Color對象的數組。

該方法基本上檢查相同顏色的像素的指定像素周圍,然後再次運行該方法進行下一個和下一個,直到整個區域被填充。

如果你知道計算機中的堆棧和遞歸的任何內容,那麼你可能會意識到這將很快導致stackoverflowror並暫停程序。我試圖弄清楚的是圍繞遞歸的方式。有人能請我指出正確的方向圍繞遞歸和stackoverflowerror?預先感謝能夠幫助的人。

回答

1

可能是因爲您可以使用一個列表:最初您將其填入要開始的像素。然後你有一個迭代循環,直到列表爲空。在循環中,您從列表中取一個像素並檢查其顏色。如果顏色匹配,則將其重新着色到列表中。如果顏色不匹配忽略像素。所以我會使用一個輔助類來存儲像素的座標。因此,它可能看起來像這樣(一些錯誤檢查,...可能會丟失,但這可能是一種方式):

class PixelCoordinate { 
    public int x; 
    public int y; 
    public PixelCoordinate(int x, int y) { 
     this.x = x; this.y = y; 
    } 
} 

Color beforeColor = img[x][y]; 
List<PixelCoordinate> worklist = new ArrayList<PixelCoordinate>(); 
// The pixel to start with 
worklist.add(new PixelCoordinate(x, y)); 
while (worklist.isEmpty() == false) { 
    // Take one pixel from the list 
    PixelCoordinate pixel = list.get(0); 
    list.remove(0); 

    // Check its color 
    if (img[x][y].equals(beforeColor) { 
     // Apply new color 
     img[x][y] = foregroundColor; 
     // Check neighbors 
     if (x-1 >= 0) { 
      list.add(new PixelCoordinate(x-y, y)); 
     } 
     // Add other neighbors... 
    } 
} 
+0

這是非常有幫助的,因爲我通常不會使用列表,並會有從來沒有想過這個。我確實改變了一些東西,因爲我需要的東西存在一些錯誤/誤解,但它效果很好。另外,爲什麼基本上使用Point對象的新類? – pokeyOne

+0

好吧,說實話,我從來沒有找到那個班,當我需要它。除此之外,我經常想用座標來存儲額外的數據,在這種情況下,一個輔助類很容易實現 - 但是對於這種情況,Java Point類很​​好用。 – sleepy42

相關問題