Hi!
I am looking for a way to load a large number of images (PNG files extracted from a video, all inside a folder in the .pde file’s directory) in a sequence:
- Load the first image in the sequence (for example: “abc00001.png”, from a folder called “Sequence”)
- Apply transformations to a PShape object based on the data in the pixel[] of that image
- Save an image of the transformed PShape (maybe using saveFrame()? )
- Load the next image in the sequence (“abc000002.png”)
… etc
I have looked at similar questions, but most of them deal with a relatively small number of images (so they do not scale to what I hope to use this application for). I know there are some libraries that can play image sequences, but they also seem to preload everything before playback.
Appreciate any help or advice!
1 Like
Your basic outline should work! If your images are all sequentially-named, you should be able to load/save them with a single for loop:
for (int i=0; i<numImages; i++) {
String inputFilename = "Sequence/" + "abc" + nf(i, 5) + ".png";
PImage frame = loadImage(inputFilename);
// do your processing here
String outputFilename = "Output/" + "abc" + nf(i, 5) + ".png";
save(outputFilename);
// or frame.save(outputFilename), depending on what you're doing
}
The nf()
command adds the leading zeroes you have in your question. If you do this in setup()
instead of draw()
, it will run faster since it doesn’t need to display each frame onscreen.
You might also want to optimize your code – commands like red()
are slower than bit-shifting, which can really add up!
3 Likes
Thank you very much for your help, I am looking forward to trying this out in my code.
I have considered implementing bit-shifting; need to go through the documentation to make sure I understand everything.
Take care!
1 Like
Happy to help!
Bit shifting looks weird but is pretty easy once you get the hang of it. These two do the same thing…
color myColor = color(255, 150, 0);
float r = red(myColor);
float r = myColor >> 16 & 0xFF; // both give you a value of 255
Same for green and blue…
float b = myColor >> 8 & 0xFF;
float g = myColor & 0xFF;
Once you memorize the expressions, it becomes natural to start using them instead of red()
etc.
2 Likes
Both the image loading/ saving loop and the bit-shifting worked great. Thank you again!
I did not notice much difference in performance when using bit-shifting (though I only tested this on a small sequence of images). After a bit of research, I suspect the following line (from a Processing tutorial) slows the program down quite a bit:
color myColor = frame.pixels[loc];
Is there a way to optimize this further?
Yeah, I’ve found that sometimes the usual red()
command is just as fast – hard to predict in my experience. Looking up the color value should be pretty quick. There’s a point where image processing is just going to be slow, especially compared with other languages like C or shaders. Can you post you sketch so far?