Вставить значение в массив в цикле - PullRequest
0 голосов
/ 24 августа 2018

Я работаю над программой, которая считает пиксели и их RGB.Я пытаюсь вставить эти значения в двумерный массив, но после одного цикла программа выдает исключение.Почему это происходит?

Когда я закомментирую строку массива в цикле, она не прерывается.

package imaging;

import java.awt.*;
import java.awt.image.BufferedImage;

import java.io.*;

import javax.imageio.ImageIO;
import javax.swing.JFrame;

public class Imaging3 {

    BufferedImage image;
    int width, heigth, test;
    int i, j;
    int[][] hor = new int[i][j];

    public Imaging3(){
        try {
            File input = new File("img1.png");
            image = ImageIO.read(input);
            width = image.getWidth();
            heigth = image.getHeight();

            int count = 0;

            System.out.println("Horizontal scan: ");

            for (i = 0; i < heigth; i++){
                for (j = 0; j < width; j++){

                    count++;
                    Color c = new Color(image.getRGB(j, i));
                    System.out.println("nr " + count + "| " + c.getRed() + " " + c.getGreen() + " " + c.getBlue());
                    hor[i][j] = c.getRed();
                    }
            }

        }catch (Exception e) {
        System.out.println("Program over");
        }
    }

    static public void main(String args[]) throws Exception{
        Imaging3 obj = new Imaging3();
    }
}

Ответы [ 3 ]

0 голосов
/ 24 августа 2018

Поскольку вы определили i и j как свойства класса, их значения по умолчанию равны 0. Поэтому следующая строка создает массив размером 0 и 0 для обоих измерений:

int[][] hor = new int[i][j]; 

Удаление экземпляра массива из свойства непосредственного создания экземпляра свойства и нового массива сразу после считывания ширины и высоты вашего изображения следующим образом:

public class Imaging3 {

    BufferedImage image;
    int test;
    int[][] hor;

    public Imaging3(){
        try {
            File input = new File("img1.png");
            image = ImageIO.read(input);
            int width = image.getWidth();
            int heigth = image.getHeight();

            hor = new int[height][width];

            int count = 0;

            System.out.println("Horizontal scan: ");

            for (int i = 0; i < heigth; i++){
                for (int j = 0; j < width; j++){

                    count++;
                    Color c = new Color(image.getRGB(j, i));
                    System.out.println("nr " + count + "| " + c.getRed() + " " + c.getGreen() + " " + c.getBlue());
                    hor[i][j] = c.getRed();
                    }
            }

        }catch (Exception e) {
        System.out.println("Program over");
        }
    }

    static public void main(String args[]) throws Exception{
        Imaging3 obj = new Imaging3();
    }
}
0 голосов
/ 24 августа 2018

Вы не присваиваете значения i и j, поэтому они равны нулю, значение по умолчанию для типа int.Тогда массив hor становится массивом 0 * 0.

0 голосов
/ 24 августа 2018

Проблема с вашим кодом в том, что при инициализации массива здесь:

int i, j;
int[][] hor = new int[i][j];

Это можно прочитать как:

int i, j=0;
int[][] hor = new int[0][0];

Значением по умолчанию для int является 0, поэтому в основном вы создаете пустой двумерный массив. Когда вы пытаетесь вставить значения, выдается исключение.

Чтобы исправить это, переместите инициализацию массива в коде, где вы уже знаете высоту и ширину.

 width = image.getWidth();
 height= image.getHeight();

 int[][] hor = new int[height][width];

И уберите эти i, j сверху. Они вам не нужны;) Определите их только для циклов. Хорошей практикой является определение переменной там, где она вам нужна, а не на уровне класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...