📜  Java Applet |实现洪水填充算法(1)

📅  最后修改于: 2023-12-03 15:15:55.127000             🧑  作者: Mango

Java Applet 实现洪水填充算法

简介

本文主要介绍如何在 Java Applet 中实现洪水填充算法。

洪水填充算法又称种子填充算法,是一种图像处理算法,通过选定一个像素作为种子点,沿着其相邻像素颜色是否与设定值相等的原则进行着色,最终形成一个由同种颜色构成的区域,用于图像填充、描边、选择等操作。

实现步骤
1. 加载图片

在 Java Applet 中,我们需要先加载一张图片用于演示。

Image img = new ImageIcon("image.png").getImage();
2. 绘制图片

接下来,我们需要在 Applet 中绘制这张图片。

public void paint(Graphics g) {
    g.drawImage(img, 0, 0, this);
}
3. 选定种子点

在图片上单击鼠标,可以选定一个像素作为种子点。

public void mouseClicked(MouseEvent e) {
    int x = e.getX();
    int y = e.getY();
    floodFill(x, y, Color.RED);
    repaint();
}
4. 实现洪水填充算法

实现洪水填充算法的核心是递归调用。首先将种子点颜色设为目标颜色,然后逐个比较四个相邻点的颜色,如果与填充颜色相同,就将其颜色也更改为目标颜色,并递归比较其相邻点,直到所有与种子点相邻的点都被填充为止。

private void floodFill(int x, int y, Color targetColor) {
    int width = img.getWidth(this);
    int height = img.getHeight(this);
    Color fillColor = targetColor;
    int pixel = img.getRGB(x, y);
    Color clickedColor = new Color(pixel);
    if (!clickedColor.equals(targetColor)) {
        floodFill(x, y, clickedColor, fillColor, width, height);
    }
}

private void floodFill(int x, int y, Color clickedColor, Color targetColor, int width, int height) {
    int currentPixel = img.getRGB(x, y);
    Color currentColor = new Color(currentPixel);
    if (currentColor.equals(clickedColor)) {
        img.setRGB(x, y, targetColor.getRGB());
        if (x > 0) {
            floodFill(x - 1, y, clickedColor, targetColor, width, height);
        }
        if (x < width - 1) {
            floodFill(x + 1, y, clickedColor, targetColor, width, height);
        }
        if (y > 0) {
            floodFill(x, y - 1, clickedColor, targetColor, width, height);
        }
        if (y < height - 1) {
            floodFill(x, y + 1, clickedColor, targetColor, width, height);
        }
    }
}
完整代码
import javax.swing.*;
import java.applet.Applet;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class FloodFillApplet extends Applet implements MouseListener {
    private Image img;

    public void init() {
        img = new ImageIcon("image.png").getImage();
        addMouseListener(this);
    }

    public void paint(Graphics g) {
        g.drawImage(img, 0, 0, this);
    }

    public void mouseClicked(MouseEvent e) {
        int x = e.getX();
        int y = e.getY();
        floodFill(x, y, Color.RED);
        repaint();
    }

    private void floodFill(int x, int y, Color targetColor) {
        int width = img.getWidth(this);
        int height = img.getHeight(this);
        Color fillColor = targetColor;
        int pixel = img.getRGB(x, y);
        Color clickedColor = new Color(pixel);
        if (!clickedColor.equals(targetColor)) {
            floodFill(x, y, clickedColor, fillColor, width, height);
        }
    }

    private void floodFill(int x, int y, Color clickedColor, Color targetColor, int width, int height) {
        int currentPixel = img.getRGB(x, y);
        Color currentColor = new Color(currentPixel);
        if (currentColor.equals(clickedColor)) {
            img.setRGB(x, y, targetColor.getRGB());
            if (x > 0) {
                floodFill(x - 1, y, clickedColor, targetColor, width, height);
            }
            if (x < width - 1) {
                floodFill(x + 1, y, clickedColor, targetColor, width, height);
            }
            if (y > 0) {
                floodFill(x, y - 1, clickedColor, targetColor, width, height);
            }
            if (y < height - 1) {
                floodFill(x, y + 1, clickedColor, targetColor, width, height);
            }
        }
    }

    public void mousePressed(MouseEvent e) {}

    public void mouseReleased(MouseEvent e) {}

    public void mouseEntered(MouseEvent e) {}

    public void mouseExited(MouseEvent e) {}
}