координаты вне границ: bufferedimage

1

Я сделал программу для выделения красных синих и зеленых компонентов изображения, но приведенный ниже код дает ошибку:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Coordinate out of bounds!
at sun.awt.image.ByteInterleavedRaster.getDataElements(ByteInterleavedRaster.java:318)
at java.awt.image.BufferedImage.getRGB(BufferedImage.java:888)
at rgb.Rgb.main(Rgb.java:46):

Вот исходный код:

public static void main(String[] args) {
    String type = "jpg";
    BufferedImage img = null;
    try {
        img = ImageIO.read(new File("d:\\a.jpg"));
        System.out.println(img.getWidth() + "     " + img.getHeight());

    } catch (IOException ex) {
        Logger.getLogger(Rgb.class.getName()).log(Level.SEVERE, null, ex);

    }

    BufferedImage rp, gp, bp;

    rp = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_ARGB);
    bp = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_ARGB);
    gp = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_ARGB);

    for (int i = 1; i <= img.getHeight(); i++) {
        for (int j = 1; j <= img.getWidth(); j++) {

            int pixel = img.getRGB(i, j);
            int alpha = pixel & 0xff000000;
            int red = (pixel >> 16) & 0xff;
            int green = (pixel >> 8) & 0xff;
            int blue = (pixel) & 0xff;
            rp.setRGB(i, j, alpha | (red << 16));
            gp.setRGB(i, j, alpha | (green << 8));
            bp.setRGB(i, j, alpha | blue);

        }

    }

    try {
        ImageIO.write(rp, type, new File("d:\\red.jpg"));
        ImageIO.write(gp, type, new File("d:\\green.jpg"));
        ImageIO.write(bp, type, new File("d:\\blue.jpg"));
    } catch (IOException ex) {
        Logger.getLogger(Rgb.class.getName()).log(Level.SEVERE, null, ex);
    }
Теги:
rgb
bufferedimage

2 ответа

1
Лучший ответ

Метод getRGB(x,y) означает, что ваш внешний контур должен быть для ширины и внутреннего цикла для высоты. Изменить на

for (int i = 0; i < img.getWidth(); i++) {
        for (int j = 0; j < img.getHeight(); j++) {

ПРИЧИНА
Вы пытаетесь получить координату, которой не существует. Это потому что

  1. Ваш цикл должен начинаться с 0 и заканчиваться на getWidth() -1/getHeight() -1 в качестве последней координаты (WIDTH -1, HEIGHT -1)
  2. Вы, внешний цикл, получаете значение y, а внутренний получает значение x, поэтому вы пытаетесь получить значение (y, x), пока оно должно быть (x, y). Это не вызовет никаких проблем, если это квадратное изображение, но если оно прямоугольное, это вызовет исключение, как это произошло в вашем случае.

Поэтому внесите изменения, как я предложил в коде, и он должен работать.

  • 0
    все еще получаю ту же ошибку @ Niru
  • 0
    Теперь проверь это. Я упустил момент.
1

Вы получаете исключение ArrayIndexOutOfBoundsException, потому что ваши циклы отключены на единицу. Индексы пикселей начинаются с 0 (не 1) и выполняются до getWidth() -1 и getHeight() -1.

Вторая проблема заключается в том, что вы меняете аргументы при вызове getRGB(). Подпись getRGB - getRGB (int x, int y), но вы вызываете getRGB (y, x).

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

Вот скорректированный код, с я и j, переименованный в строку и col, чтобы помочь уточнить:

for (int row = 0; row < img.getHeight(); row++) 
{
    for (int col = 0; col < img.getWidth(); col++) 
    {
        int pixel = img.getRGB(col, row);    // getRGB(x,y)
        int alpha = pixel & 0xff000000;
        int red = (pixel >> 16) & 0xff;
        int green = (pixel >> 8) & 0xff;
        int blue = (pixel) & 0xff;
        rp.setRGB(col, row, alpha | (red << 16));
        gp.setRGB(col, row, alpha | (green << 8));
        bp.setRGB(col, row, alpha | blue);
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню