-1

値を取得する必要があり、画像のピクセル値を一致させる必要があります。しかし、このコードを実行すると、StackOverflowError.

この問題を解決するために Java でスタック メモリを増やす方法。

public class ImageToText {
    private final int ALPHA = 24;
    private final int RED = 16;
    private final int GREEN = 8;
    private final int BLUE = 0;

    public static void main(String args[]) throws IOException {
        File file = new File("C:\\image.jpg");
        BufferedImage image = ImageIO.read(file);
        int color21=image.getHeight();
        int color31=image.getWidth();
        getRGBA(image,color31,color21);

        for (int i = 0; i < image.getHeight(); i++) 
        {
            for (int j = 0; j < image.getWidth(); j++)
            {
                int color = image.getRGB(j, i);
                int color2=image.getHeight();
                int color3=image.getWidth();
                System.out.println(color2);
            }
        }
    }

    public static int[] getRGBA(BufferedImage img, int x, int y)
    {
        int[] color = new int[4];
        int[] originalPixel =  getRGBA(img,x,y);

        for (int i=0;i<img.getWidth();i++)
        {
            for (int j=0;j<img.getHeight();j++)
            {
                int[] color1 =  getRGBA(img,i,j);

                if (originalPixel[0] == color1[0] && originalPixel[1] == color1[1] && originalPixel[2] == color1[2] && originalPixel[3] == color1[3])
                {
                    img.setRGB(i, j,Color.red.getRGB());
                }
                else
                {
                    img.setRGB(i, j,Color.yellow.getRGB());
                }
            }
        }
        return color;
    }
}

このエラーを克服するには?

4

3 に答える 3

4

getRGBA は自分自身を無限に呼び出します。

public static int[] getRGBA(BufferedImage img, int x, int y)

  {

int[] color = new int[4];


 int[] originalPixel =  getRGBA(img,x,y);

この種のことは、StackOverflowError を引き起こします。

recursion の基本ケースを追加することを検討してください。これにより、コードが常に自分自身を呼び出すとは限らず、「抜け道」があります。

于 2013-03-29T06:56:30.203 に答える
0

関数 getRGBA のこの行:

int[] originalPixel =  getRGBA(img,x,y);

これにより、無限再帰が発生するはずです。

于 2013-03-29T06:57:44.050 に答える
0

メソッドから、main以下のメソッドを呼び出していますgetRGBA。メソッド内で、getRGBAメソッドを再度呼び出しています。これにより、終了基準のない循環/再帰実行が行われます。

public static int[] getRGBA(BufferedImage img, int x, int y) {
    int[] color = new int[4];
    int[] originalPixel =  getRGBA(img,x,y);
}

再帰的な実行が停止するように、メソッド呼び出しの前後に何らかの条件を追加する必要があります。あなたの特徴は、あなたが置くことができる条件を示唆するのに十分明確ではありません.

public static int[] getRGBA(BufferedImage img, int x, int y) {
    int[] color = new int[4];
    if (some condition which becomes true) {
        int[] originalPixel =  getRGBA(img,x,y);
    }
}
于 2016-03-12T16:44:53.647 に答える