StackOverflowError в Java "Fill Image" функция - PullRequest
0 голосов
/ 08 декабря 2011

Я создавал функцию, которая действует как инструмент заливки краски для класса BufferedImage в Java.Он использует рекурсию для выполнения заполнения.К сожалению, однако, когда я выполняю код, он дает мне java.lang.StackOverflowError.Я также обнаружил, что он не распознает BaseColor, так как когда я использовал System.out.println для проверки «красного» цветового канала BaseColor, он дал мне ноль там, где должно было быть 255. (Цвет былбелый.) Вот код:

public static void BufferedImageFill(BufferedImage bufferedImage, int FillX, int FillY, int FillRed, int FillGreen, int FillBlue, int FillAlpha, int Tolerance, boolean IsFirstPixel, Color BaseColor) {
    if (IsFirstPixel == true) {
        BaseColor = new Color(RGBAValuesToInt(BufferedImageGetPixelARGB(bufferedImage, "R", FillX, FillY), BufferedImageGetPixelARGB(bufferedImage, "G", FillX, FillY), BufferedImageGetPixelARGB(bufferedImage, "B", FillX, FillY), BufferedImageGetPixelARGB(bufferedImage, "A", FillX, FillY)));
    }
    if (FillX >= 0 && FillY >= 0 && FillX < bufferedImage.getWidth() && FillY < bufferedImage.getHeight()) {
        int ThisR = BufferedImageGetPixelARGB(bufferedImage, "R", FillX, FillY);
        int ThisG = BufferedImageGetPixelARGB(bufferedImage, "G", FillX, FillY);
        int ThisB = BufferedImageGetPixelARGB(bufferedImage, "B", FillX, FillY);
        if (Math.abs(ThisR - BaseColor.getRed()) <= Tolerance && Math.abs(ThisG - BaseColor.getGreen()) <= Tolerance && Math.abs(ThisB - BaseColor.getBlue()) <= Tolerance) {
            bufferedImage.setRGB(FillX, FillY, RGBAValuesToInt(FillRed, FillGreen, FillBlue, FillAlpha));
            BufferedImageFill(bufferedImage, FillX - 1, FillY - 1, FillRed, FillGreen, FillBlue, FillAlpha, Tolerance, false, BaseColor);
            BufferedImageFill(bufferedImage, FillX - 1, FillY, FillRed, FillGreen, FillBlue, FillAlpha, Tolerance, false, BaseColor);
            BufferedImageFill(bufferedImage, FillX - 1, FillY + 1, FillRed, FillGreen, FillBlue, FillAlpha, Tolerance, false, BaseColor);
            BufferedImageFill(bufferedImage, FillX, FillY + 1, FillRed, FillGreen, FillBlue, FillAlpha, Tolerance, false, BaseColor);
            BufferedImageFill(bufferedImage, FillX, FillY - 1, FillRed, FillGreen, FillBlue, FillAlpha, Tolerance, false, BaseColor);
            BufferedImageFill(bufferedImage, FillX + 1, FillY - 1, FillRed, FillGreen, FillBlue, FillAlpha, Tolerance, false, BaseColor);
            BufferedImageFill(bufferedImage, FillX + 1, FillY, FillRed, FillGreen, FillBlue, FillAlpha, Tolerance, false, BaseColor);
            BufferedImageFill(bufferedImage, FillX + 1, FillY + 1, FillRed, FillGreen, FillBlue, FillAlpha, Tolerance, false, BaseColor);
        }
    }
}

Кто-нибудь знает, почему это происходит?Спасибо за любую помощь!

-Нейл

Ответы [ 2 ]

2 голосов
/ 08 декабря 2011

Если я правильно прочитал код, когда ваш метод вызывается для заполнения пикселя (0, 0), он в какой-то момент сам вызовет для заполнения (среди других точек) пиксель (1, 0).Этот вызов, в свою очередь, вызовет себя, чтобы снова заполнить пиксель (0, 0).Вот почему у вас бесконечная рекурсия.(Та же проблема возникает с другими соседними точками - каждая возвращается назад и заполняет точку, которая привела к ее заполнению.)

1 голос
/ 08 декабря 2011

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

...