2010-11-16 3 views
6

Je ne suis pas en mesure de trouver une implémentation d'algorithme d'inondation pour Android.Algorithme Floodfill dans Android

Une idée si une API floodfill est disponible dans Android, et sinon, existe-t-il une autre alternative?

+0

Je ne pense pas que vous puissiez obtenir un tableau de pixels à partir d'un bitmap et alterner les couleurs vous-même – schwiz

+0

Parlez-vous de retouche d'image? Ou juste un algorithme générique pour un tableau multidimensionnel? –

+0

@alien avez-vous déjà trouvé une solution à ce problème? Si oui, pensez-vous que vous pourriez me donner le code source ou un exemple? – Hades

Répondre

2

Avez-vous une définition de la forme?

Si oui, jetez un oeil à la Canvas docs. Vous pouvez remplir une région en définissant une zone de clip, puis en appelant canvas.drawColor.

exemple rugueux:

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

Il existe plusieurs fonctions de clip, de sorte que vous devriez être en mesure construire tout ce que vous essayez de remplir. En revanche, si vous voulez remplir une zone dans une image bitmap chargée, je ne sais pas.

2

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

Vous devriez utiliser un AsyncTask d'utiliser l'algorithme de floodfill. Utilisation de la même chose sur le thread principal causé une erreur de mémoire. Même si j'utilise l'algorithme floofill, le fait de remplir une grande zone prend plus de temps, ce qui fait que l'application ne répond plus à temps.

Fill the complete canvas but keep the bound fill area as it is like circle, rectangle. Ce lien pourrait vous aider à résoudre votre problème

+0

Wow beau travail ..... +1 pour une bonne réponse –