“Java中的StackOverflowerr”;“填充图像”;作用

“Java中的StackOverflowerr”;“填充图像”;作用,java,bufferedimage,fill,stack-overflow,Java,Bufferedimage,Fill,Stack Overflow,我一直在为Java中的BuffereImage类创建一个类似于绘制桶工具的函数。它使用递归来执行填充。遗憾的是,当我执行代码时,它给了我一个java.lang.StackOverflowerError。我还发现它无法识别基色,因为当我使用System.out.println检查基色的“红色”颜色通道时,它给了我一个零,而应该是255。(颜色为白色)以下是代码: public static void BufferedImageFill(BufferedImage bufferedImage, in

我一直在为Java中的BuffereImage类创建一个类似于绘制桶工具的函数。它使用递归来执行填充。遗憾的是,当我执行代码时,它给了我一个java.lang.StackOverflowerError。我还发现它无法识别基色,因为当我使用System.out.println检查基色的“红色”颜色通道时,它给了我一个零,而应该是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);
        }
    }
}
public static void BufferedImageFill(BufferedImage BufferedImage,int FillX,int FillY,int FillRed,int FillGreen,int FillBlue,int FillAlpha,int公差,boolean IsFirstPixel,Color BaseColor){
如果(IsFirstPixel==true){
BaseColor=新颜色(RGBAValuesToInt(BuffereImage,“R”,FillX,FillY),BuffereImage GetPixelArgb(BuffereImage,“G”,FillX,FillY),BuffereImage GetPixelArgb(BuffereImage,“B”,FillX,FillY),BuffereImage GetPixelArgb(BuffereImage,“A”,FillX,FillY));
}
如果(FillX>=0&&FillY>=0&&FillXif(Math.abs(ThisR-BaseColor.getRed())您似乎没有任何线条可以停止递归。如果您绘制的源和目标颜色都在公差范围内,那么它将无限地绘制像素并最终溢出堆栈。您需要一条线条来检查它是否已经是正确的颜色,如果是,则返回。

您似乎没有任何线条可以停止你的递归。如果你从和到的颜色都在公差范围内,那么它将无限地绘制像素并最终溢出堆栈。你需要一条线来检查它是否已经是正确的颜色,如果已经是,则返回。

如果我读对了代码,当调用你的方法填充像素(0,0)时,它将在某个点调用自身来填充(在其他点中)像素(1,0)。该调用将再次调用自身来填充像素(0,0)。这就是为什么会有无限递归。(其他相邻点也会出现同样的问题-每个点都返回并填充导致其被填充的点。)

如果我读对了代码,当调用您的方法填充像素(0,0)时,它会在某个点调用自身填充(在其他点中),像素(1,0)。该调用反过来又会调用自身填充像素(0,0)。这就是为什么会有无限递归。(其他相邻点也会出现同样的问题-每个点都返回并填充导致其填充的点。)

现在我明白了…感谢您的洞察力!现在我明白了…感谢您的洞察力!