In a previous random image composition maker images were loaded in based on a random number and relied on the images being named as numbers (such as "01.png"). Using java.io.File we can make a composition maker that has more flexibility in loading images; it doesn't rely on us knowing ahead of time what the file names are. We can just point our application to a folder and tell it to use the images it finds there. This allows us to create a random image composition via directory list.
The first image loaded in is positioned at 0,0:
image(loadImage((String)source + "/" + (String)filenames[int(random(filenames.length))]), 0, 0);
The images loaded after the first are located at random locations using:
image(loadImage((String)source + "/" + (String)filenames[int(random(filenames.length))]), random(width), random(height));
Like the previous composition maker, images have a random colored tint, and a random opacity. The tint function with the default color mode as used here takes four parameters:
//tint([red], [green], [blue], [opacity]) tint(ceil(random(255)), ceil(random(255)), ceil(random(255)), ceil(random(100)));
Search a Directory for Images
To set up the path to the folder where the images are you can use java.io.File like this:
File folder = new File(dataPath("c://media"));
Then the file names can be saved in an array from which a random file name can be chosen:
String[] filenames = folder.list();
If there are non-image files in the same folder you can add code to check that the file has the right extension before trying to load it into the Processing Sketch:
String[] imageFileNames = match((String)source + "/" + (String)filenames[int(random(filenames.length))], ".png"); if (imageFileNames != null) { image(loadImage((String)source + "/" + (String)filenames[int(random(filenames.length))]), random(width), random(height)); }
Random Image Composition via Directory List Code
//http://programmingisfun.com void setup() { size(400,400); String source= "c://media"; File folder = new File(dataPath(source)); String[] filenames = folder.list(); if (filenames.length>0) { tint(random(255), random(255), random(255), 255); image(loadImage((String)source + "/" + (String)filenames[int(random(filenames.length))]), 0, 0); for(int i=0; i< filenames.length; i++) { tint(random(255), random(255), random(255), random(255)); image(loadImage((String)source + "/" + (String)filenames[int(random(filenames.length))]), random(width), random(height)); } } }
These code snippets were written in 2008 but work with the current version of Processing (as of this post, v3).