2016-05-11 3 views
1

Je dois remplir cette image en niveaux de gris avec une couleur, par exemple rouge. J'ai pensé utiliser l'algorithme Flood Fill parce que j'ai besoin de remplir certains points.Algorithme Flood Fill pour une image en niveaux de gris anti-aliasing Java

J'ai trouvé ce method.But le résultat a quelques parties blanches laid, à cause de l'anti-aliasing des lignes de l'image.

dans mon code: Couleur targetColor = Blanc, Couleur replacementColor = Rouge.

Je pense que j'ai besoin de changer le remplacement en plus de couleurs grises, pas seulement blanc.

Dois-je m'en tenir à cette méthode et changer un peu? ou pour trouver autre chose? Si oui, que changer?

Je n'ai aussi essayé ce lien, mais il ne fonctionne pas:

noblemaster.com/public/download/FloodFill.java.html

lien

pour les images:

image without red color

image with filled red color

public void floodFill(BufferedImage image, Point node, Color targetColor, Color replacementColor) { 
     int width = image.getWidth(); 
     int height = image.getHeight(); 
     int target = targetColor.getRGB(); 
     int replacement = replacementColor.getRGB(); 
     if (target != replacement) { 
      Deque<Point> queue = new LinkedList<Point>(); 
      do { 
      int x = node.x; 
      int y = node.y; 
      while (x > 0 && image.getRGB(x - 1, y) == target) { 
       x--; 
      } 
      boolean spanUp = false; 
      boolean spanDown = false; 
      while (x < width && image.getRGB(x, y) == target) { 
       image.setRGB(x, y, replacement); 
       if (!spanUp && y > 0 && image.getRGB(x, y - 1) == target) { 
       queue.add(new Point(x, y - 1)); 
       spanUp = true; 
       } else if (spanUp && y > 0 && image.getRGB(x, y - 1) != target) { 
       spanUp = false; 
       } 
       if (!spanDown && y < height - 1 && image.getRGB(x, y + 1) == target) { 
       queue.add(new Point(x, y + 1)); 
       spanDown = true; 
       } else if (spanDown && y < height - 1 && image.getRGB(x, y + 1) != target) { 
       spanDown = false; 
       } 
       x++; 
      } 
      } while ((node = queue.pollFirst()) != null); 
     } 
     } 
+0

Essayez de calculer la distance du pixel avec le blanc et si elle est inférieure à une valeur * X *, vous devriez aussi la peindre en rouge. – raven

+0

Cela pourrait aider: http://stackoverflow.com/questions/2103368/color-logic-algorithm – raven

+0

Ok cela fonctionne, mais il y a encore quelque chose que j'ai raté. Si je veux passer du blanc à la transparence. Maintenant, la distance de couleur ne peut pas être effectuée car rgb ne prend pas en compte un composant alpha. Mais je pense que c'est pour une autre question .. –

Répondre

1

C'est ce que j'ai fait à la fin et this est l'image finale.

distanceOfColor est un paramètre, dans mon cas, un bon nombre était entre 300-400 plus qu'il efface toute la couleur grise anti-aliasing. Probablement vous ne devriez pas le comparer avec la couleur blanche "exacte"

public void floodFill(BufferedImage image, Point node, Color targetColor, Color replacementColor) { 
     int width = image.getWidth(); 
     int height = image.getHeight(); 
     int target = targetColor.getRGB(); 
     int replacement = replacementColor.getRGB(); 
     int distanceOfColor=320; 
     if (target != replacement) { 
      Deque<Point> queue = new LinkedList<Point>(); 
      do { 
      int x = node.x; 
      int y = node.y; 
      while (x > 0 && ColorDistance(image.getRGB(x - 1, y), target)<=distanceOfColor) { 
       x--; 
      } 
      boolean spanUp = false; 
      boolean spanDown = false; 
      while (x < width && ColorDistance(image.getRGB(x, y), target) <=distanceOfColor) { 
       image.setRGB(x, y, replacement); 
       if (!spanUp && y > 0 && image.getRGB(x, y - 1) == target) { 
       queue.add(new Point(x, y - 1)); 
       spanUp = true; 
       } else if (spanUp && y > 0 && ColorDistance(image.getRGB(x, y - 1), target) >distanceOfColor) { 
       spanUp = false; 
       } 
       if (!spanDown && y < height - 1 && ColorDistance(image.getRGB(x, y + 1), target) <=distanceOfColor) { 
       queue.add(new Point(x, y + 1)); 
       spanDown = true; 
       } else if (spanDown && y < height - 1 && ColorDistance(image.getRGB(x, y + 1), target) >distanceOfColor) { 
       spanDown = false; 
       } 
       x++; 
      } 
      } while ((node = queue.pollFirst()) != null); 
     } 
     }