1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Preenchimento com algoritmo de Flood Fill

Olá Pessoal,

Estou desenvolvendo uma aplicação para trabalhar com imagens, e estou com o seguinte problema :

eu escrevi um algoritmo de flood fill que considera uma vizinhança de 8 vizinhos. Esse algoritmo funciona bem e consigo pintar imagens com tamanho natural.

O grande problema está quando utilizo uma imagem redimensionada.O algoritmo pinta a região do clique, porém bem perto das bordar é possível ver alguns pontinhos que não foram pintados.

Isso acontece apenas com imagens redimensionadas. Alguém com mais experiência em computação gráfica e processamento de imagens pode me ajudar?

Esse algoritmo fui eu que escrive com base nos conceitos que aprendi na aula. Testei com algumas implementações que achei na internet e o problema tbm ocorre. Alguem sabe se é possivel resolver isso?

segue meu algoritmo. ( aceito sugestões sobre a melhora do mesmo):

/**
     * @param image {@link BufferedImage}
     * @param point {@link Point}
     * @param oldColor a cor a ser substituida
     * @param newColor a nova cor a ser pintada.
     */
    public static void flood(BufferedImage image,Point point,int oldColor, int newColor){
        Queue<Point> q = new LinkedList<>();

        if(point.getX() >  image.getWidth() || point.getY() > image.getHeight() || point.getX() < 0 || point.getY() < 0 ){
            return;
        }

        q.add(point);
        while(!q.isEmpty()){
            Point p = q.remove();
            int x = (int) p.getX();
            int y = (int) p.getY();
            int pAltura = image.getHeight();
            int pLargura = image.getWidth();

            if( x-1 < pLargura && y < pAltura){
                if(image.getRGB(x-1, y) == oldColor){
                    image.setRGB(x-1, y, newColor);
                    q.add(new Point(x-1,y));
                }
            }

            if( x+1 < pLargura && y < pAltura){
                if(image.getRGB(x+1, y) == oldColor){
                    image.setRGB(x+1, y, newColor);
                    q.add(new Point(x+1,y));
                }
            }

            if( x < pLargura && y-1 < pAltura){
                if(image.getRGB(x, y-1) == oldColor){
                    image.setRGB(x, y-1, newColor);
                    q.add(new Point(x,y-1));
                }
            }

            if( x < pLargura && y+1 < pAltura){
                if(image.getRGB(x, y+1) == oldColor){
                    image.setRGB(x, y+1, newColor);
                    q.add(new Point(x,y+1));
                }
            }

            if( x-1 < pLargura && y-1 < pAltura){
                if(image.getRGB(x-1, y-1) == oldColor){
                    image.setRGB(x-1, y-1, newColor);
                    q.add(new Point(x-1,y-1));
                }
            }

            if( x+1 < pLargura && y-1 < pAltura){
                if(image.getRGB(x+1, y-1) == oldColor){
                    image.setRGB(x+1, y-1, newColor);
                    q.add(new Point(x+1,y-1));
                }
            }

            if( x-1 < pLargura && y+1 < pAltura){
                if(image.getRGB(x-1, y+1) == oldColor){
                    image.setRGB(x-1, y+1, newColor);
                    q.add(new Point(x-1,y+1));
                }
            }

            if( x+1 < pLargura && y+1 < pAltura){
                if(image.getRGB(x+1, y+1) == oldColor){
                    image.setRGB(x+1, y+1, newColor);
                    q.add(new Point(x+1,y+1));
                }
            }
        }
    }
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

2 respostas

Não é a resposta que estava procurando? Procure outras perguntas com as tags java algoritmos swing imagens otimização ou faça a sua própria pergunta.