Извлечение изображения из массива в обработке - PullRequest
0 голосов
/ 16 ноября 2018

Есть ли у кого-нибудь предложения о том, что может быть не так с этим кодом? Я пытаюсь загрузить плитки изображений в большой массив, а затем отобразить их. Позже я буду перетасовать кусочки. Проблема, с которой я сталкиваюсь, видна внизу. У меня есть цикл for, который должен вставить значение i в выходной массив и отобразить соответствующее изображение с этим значением индекса. Вместо этого я получаю исключение нулевого указателя. Если я заменю букву i на целое число, оно будет работать отлично. Что может помешать обработке передать это значение, если я в массив? Какие-нибудь мысли? Благодарю.

int tileSize = 100;
PImage out; PImage sample;
PImage img;
PImage img2;
String[] imageNames = {"arctic_fox.jpg", "bbridge_in_the_am.jpg", "Kali2.jpg"};
PImage[] images = new PImage[imageNames.length];
//PImage[] output = new PImage[((1440/tileSize)*imageNames.length)*(900/tileSize)];
PImage[] output = new PImage[2000];

int tintScale = 200;
void setup() {
  fullScreen();
  for (int i=0; i < imageNames.length; i++) {
    String imageName = imageNames[i];
    images[i] = loadImage(imageName);
  }
  out = createImage(width, height, RGB);  
  noLoop();
  println("test");
}
void draw() {
  background(0);
  println(width, height);
  println(output.length);
  int counter=0;
  for (int i = 0; i < imageNames.length; i++) {
    img = loadImage(imageNames[i]);
    img.resize(0,900);
    for (int y=0; y<img.height; y+=tileSize) {
      for (int x=0; x<img.width; x+=tileSize/3) {
        sample = img.get(x, y, tileSize, tileSize);
        output[counter] = sample;
        tint(255, tintScale);
        counter++;
        //println(counter);
        //image(out, random(0, width-img_x), random(0, height-img_y));
      }
      //image(output[i],30,30);
    }
  }
  for (int i=0;i<output.length;i++){
    image(output[30],i*tileSize,i*tileSize);
  }
  //for (int y=0; y<out.height; y+=tileSize) {
  //  for (int x=0; x<out.width; x+=tileSize) {
  //    i = 800;
  //    //tint(255, tintScale);
  //    image(output[i], x, y);

  //  }
  //}
}

1 Ответ

0 голосов
/ 04 декабря 2018

Я надеюсь, что вы решили это, но это проблема:

PImage[] output = new PImage[2000];

Вы инициализируете массив с 2000 нулевыми значениями, а затем вводите менее 300 плиток.Вот почему вы получаете ошибку нулевого указателя.Вы должны вычислить, насколько большим будет ваш массив, прежде чем инициализировать его.Или, может быть, лучше использовать arraylist:

  ArrayList<PImage> output = new ArrayList<PImage>();

  //to add a tile:
  output.add(sample);

  //to draw all tile:
  for(int i = 0; i< output.size();i++)
  {
   image(output[i],i*tileSize,i*tileSize); 
  }

Вы можете узнать больше о arraylists здесь

Заключительное примечание: как говорит Кевин Воркман, loadImage () и этот процессделение на тайлы не относится к 'void draw ()'.Это должно быть в setup () или в отдельной функции, вызываемой из setup ().

...