2010-11-16 4 views
6

Ich bin nicht in der Lage, eine Floodfill-Algorithmus-Implementierung für Android zu finden.Floodfill-Algorithmus in Android

Gibt es eine Idee, ob in Android eine Floodfill-API verfügbar ist, und wenn nicht, gibt es noch eine andere Alternative?

+0

Ich glaube nicht, dass Sie ein Pixel-Array von einem Bitmap und alternativen Farben selbst erhalten können – schwiz

+0

Sprechen Sie über Bildbearbeitung? Oder nur ein generischer Algorithmus für ein mehrdimensionales Array? –

+0

@alien hast du jemals eine lösung dafür gefunden? Wenn ja, könntest du mir den Quellcode oder ein Beispiel geben? – Hades

Antwort

2

Haben Sie eine Definition der Form?

Wenn ja, werfen Sie einen Blick auf die Canvas docs. Sie können eine Region füllen, indem Sie einen Clipbereich definieren und dann canvas.drawColor aufrufen.

Raute Beispiel:

Rect r = new Rect(0,0,300,300); 
    canvas.clipRect(r); // see also clipRegion 
    canvas.drawColor(Color.RED); 

Es gibt mehr Clips-Funktionen, so dass Sie in der Lage sein sollten, zu bauen, was Sie zu füllen versuchen.

Auf der anderen Seite, wenn Sie eine Region in einer geladenen Bitmap überfluten möchten, dann weiß ich nicht.

2

FloodFill in android

public class FloodFill { 
public void floodFill(Bitmap image, Point node, int targetColor, 
    int replacementColor) { 
int width = image.getWidth(); 
int height = image.getHeight(); 
int target = targetColor; 
int replacement = replacementColor; 
if (target != replacement) { 
    Queue<Point> queue = new LinkedList<Point>(); 
    do { 
     int x = node.x; 
     int y = node.y; 
     while (x > 0 && image.getPixel(x - 1, y) == target) { 
      x--; 
     } 
     boolean spanUp = false; 
     boolean spanDown = false; 
     while (x < width && image.getPixel(x, y) == target) { 
      image.setPixel(x, y, replacement); 
      if (!spanUp && y > 0 && image.getPixel(x, y - 1) == target) { 
       queue.add(new Point(x, y - 1)); 
       spanUp = true; 
      } else if (spanUp && y > 0 
        && image.getPixel(x, y - 1) != target) { 
       spanUp = false; 
      } 
      if (!spanDown && y < height - 1 
        && image.getPixel(x, y + 1) == target) { 
       queue.add(new Point(x, y + 1)); 
       spanDown = true; 
      } else if (spanDown && y < height - 1 
        && image.getPixel(x, y + 1) != target) { 
       spanDown = false; 
      } 
      x++; 
     } 
    } while ((node = queue.poll()) != null); 
} 
} 
} 

sollten Sie einen AsyncTask verwenden, um die Floodfill Algorithmus zu verwenden. Die Verwendung desselben im Haupt-Thread verursachte einen Speicherfehler. Selbst wenn ich den Floofill-Algorithmus verwende, dauert es manchmal länger, einen großen Bereich zu füllen, was dazu führt, dass die Anwendung nicht mehr reagiert.

Fill the complete canvas but keep the bound fill area as it is like circle, rectangle. Dieser Link könnte Ihr Problem lösen

+0

Wow schöne Arbeit ..... +1 für eine gute Antwort –

Verwandte Themen