Как сделать сетку со случайными изображениями в каждой ячейке — Обработка

#image-processing #processing

Вопрос:

Я пытаюсь построить сетку, в которой каждая ячейка заполняется случайным изображением при обработке. У меня есть более 500 изображений с именами img_xxx.jpg в папке с данными. До сих пор я создавал сетку, в которой отображаемое изображение является случайным, но это одно и то же изображение для каждой ячейки. Надеюсь, вы сможете мне помочь! Спасибо.

 final static byte GRID = 6, NUM = GRID*GRID;
PImage img;
int rand;

void setup() {
  size(400, 400);
  noLoop();
  smooth();
  background(0);

  final PImage[] imgs = new PImage[NUM];
  final int tileW = width/GRID, tileH = height/GRID;
  rand = int(random(0,687)); 
  for (int idx=0; idx!=NUM; imgs[idx  ] = loadImage("img_"   nf(rand,3)  ".jpg"));

  for (int idx=0, row=0; row!=GRID;   row)  for (int col=0; col!=GRID; 
      image(imgs[idx  ], col  *tileW, row*tileH, tileW, tileH));

  img = get();
}

void draw() {
  background(img);
}
 

Ответ №1:

Экстремальную абстракцию, которую вы сделали в своих for циклах, писать весело, но читать очень больно. Вам нужно пересчитывать rand каждое изображение, поэтому напишите свой первый for цикл следующим образом:

 for (int idx=0; idx!=NUM; idx  ) {
  rand = int(random(0, 687));
  imgs[idx] = loadImage("img_"   nf(rand, 3)  ".jpg");
}
 

или, в вашей абстрактной версии:

 for (int idx=0; idx!=NUM; imgs[idx  ] = loadImage("img_"   nf(int(random(0,687)),3)  ".jpg"));
 

(в качестве примечания, я считаю, что nf() это работает с поплавками в более новых версиях обработки, поэтому вам не понадобится эта int() команда)

У вас могут возникнуть проблемы с памятью, поскольку не все изображения могут загружаться вовремя до того, как вы их сохраните img = get(); . Один из способов решить эту проблему-увеличить время ожидания между загрузкой изображений и их отображением.

Комментарии:

1. Большое вам спасибо! Да, это действительно абстрактно, в итоге я изменил почти все