2016-05-11 5 views
1

Мне нужно заполнить этот оттенок серого цветом, например, красным. Я думал использовать алгоритм Flood Fill, потому что мне нужно заполнить некоторые определенные моменты.Алгоритм наложения наполнителей для изображения сглаживания в сглаживании Java

Я нашел этот метод. Но результат имеет некоторые уродливые белые части из-за сглаживания линий изображения.

в моем коде: Цвет targetColor = белый, Цвет заменыColor = Красный.

Думаю, мне нужно заменить замену на более серые цвета, а не только белые.

Должен ли я придерживаться этого метода и немного изменить? или найти что-то еще? Если да, что изменить?

Я попытался также эту ссылку, но она не работает:

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

ссылка на изображение:

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

Возможно, вы не должны сравнивать его с «точным» белым цветом. Попробуйте вычислить расстояние от пикселя до белого, и если оно меньше некоторого значения * X *, вы должны нарисовать его также красным цветом. – raven

+0

Это может помочь: http://stackoverflow.com/questions/2103368/color-logic-algorithm – raven

+0

Хорошо, это работает, но все еще есть что-то, что я пропустил. Если я хочу перейти от белого к прозрачному. Теперь расстояние цвета не может быть выполнено, потому что rgb не учитывает альфа-компонент. Но я думаю, что это по другому вопросу .. –

ответ

1

Это то, что я сделал в конце, и this - последнее изображение.

distanceOfColor - это параметр, в моем случае хорошее количество находилось между 300-400 больше, чем оно удалило все сглаживание серого цвета.

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