Search code examples
javaindexoutofboundsexception

Array index out of bounds exception


When I run this program that is supposed to detect circles in an image I get Array index out of bounds exception at the last method when I call drawCircles()

findCircle() read the image and searches for circles and drawCircles() draws them using Bresenaham algorithm.

public class Assig1 {

    public static void main(String[] args) {
        try {
            // arg 0 is the input image name
            BufferedImage img = ImageIO.read(new File(args[0]));

            // arg 1 is the min radius
            int minr = Integer.parseInt(args[1]);
            // arg 2 is the max radius
            int maxr = Integer.parseInt(args[2]);

            // if present, arg 3 is the max width we consider
            int w = (args.length>3) ? Integer.parseInt(args[3]) : img.getWidth();
            // if present, arg 4 is the max height we consider
            int h = (args.length>4) ? Integer.parseInt(args[4]) : img.getHeight();

            // you can look at pixel values with this API call:
            int c = img.getRGB(0,0); // get RGB value of pixel at (0,0)

            // you can write out pixels with the setRGB() API.  However,
            // what you get will depend on the colour model, so here
            // we use a Graphics2D object.

            // graphical output
            Graphics2D g2 = img.createGraphics();
            // use red
            g2.setColor(Color.RED);

            // call circle drawing algorithm
           drawCircle(5,5,3,img,g2);


            //-----
            findCircle(minr,img, w, h);

            //----

            // write out the image
            File outputfile = new File("outputimage1.png");
            ImageIO.write(img, "png", outputfile);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // Bresenham's algorithm to draw a circle
    // requires circle center and radius, as well as the
    // image and Graphics2D object with drawing colour already set.
    static void drawCircle(int cx,int cy,int r,BufferedImage img,Graphics2D g) {
        int f = 1-r;
        int ddF_x = 1;
        int ddF_y = -2 * r;
        int x = 0;
        int y = r;

        // draw cardinal points
        g.drawLine(cx,cy+r,cx,cy+r);
        g.drawLine(cx,cy-r,cx,cy-r);
        g.drawLine(cx+r,cy,cx+r,cy);
        g.drawLine(cx-r,cy,cx-r,cy);

        // draw 1/8 of the circle, taking advantage of symmetry
        while(x < y) {
            if(f >= 0) {
                y--;
                ddF_y += 2;
                f += ddF_y;
            }
            x++;
            ddF_x += 2;
            f += ddF_x;

            g.drawLine(cx+x,cy+y,cx+x,cy+y);
            g.drawLine(cx-x,cy+y,cx-x,cy+y);
            g.drawLine(cx+x,cy-y,cx+x,cy-y);
            g.drawLine(cx-x,cy-y,cx-x,cy-y);
            g.drawLine(cx+y,cy+x,cx+y,cy+x);
            g.drawLine(cx-y,cy+x,cx-y,cy+x);
            g.drawLine(cx+y,cy-x,cx+y,cy-x);
            g.drawLine(cx-y,cy-x,cx-y,cy-x);
        }

    }

    static void findCircle(int r,BufferedImage img, int w, int h) {

        //getting all the pixels from an image
        int[][] pixels = new int[w][h];

        for( int i = 0; i < w; i++ ){
             for( int j = 0; j < h; j++ ){
                   pixels[i][j] = img.getRGB( i, j );
             }
        }

         // graphical output
        Graphics2D g2 = img.createGraphics();
        // use red
        g2.setColor(Color.RED);


        for (int i1=0; i1<pixels.length; i1++) {
             for (int j1=0; j1<pixels[i1].length; j1++) {

                 if(pixels[i1][j1] != pixels[i1+r][j1]
                        || pixels[i1][j1] != pixels[i1-r][j1]
                        || pixels[i1][j1] != pixels[i1][j1+r]
                        || pixels[i1][j1] != pixels[i1][j1-r]){
                    drawCircle(i1,j1,r,img,g2);
                }
             }

         }
    }
}

Solution

  • In your findCircle method,

            if(pixels[i1][j1] != pixels[i1+r][j1]
                    || pixels[i1][j1] != pixels[i1-r][j1]
                    || pixels[i1][j1] != pixels[i1][j1+r]
                    || pixels[i1][j1] != pixels[i1][j1-r]){
                drawCircle(i1,j1,r,img,g2);
            }
    

    If r is anything but 0 this will cause an array index out of bounds exception since you're basically looping from the 0th to the nth index. Basically anywhere you're adding or subtracting r. For example, this is one of the statements that will cause this error

    pixels[i1+r][j1]