From 50fbdbca6b70129c063e76834d0976d50c574b1c Mon Sep 17 00:00:00 2001 From: Chris Hennes Date: Thu, 25 Jun 2015 12:40:39 -0500 Subject: [PATCH] Switch from RAM-cached images to strictly using the disk It was easy to let the old version run out of RAM on older computers, so this version now loads the images from the disk exclusively, with no RAM cache except of the most recently-taken photo. --- Stop_Motion_Animation.pde | 95 +++++++++++++++++++++++++-------------- 1 file changed, 62 insertions(+), 33 deletions(-) diff --git a/Stop_Motion_Animation.pde b/Stop_Motion_Animation.pde index 71f3990..0990051 100644 --- a/Stop_Motion_Animation.pde +++ b/Stop_Motion_Animation.pde @@ -66,9 +66,10 @@ Slider frameSlider; String groupName = ""; String lastFileName = ""; +String filePath = ""; int sceneNumber = 1; int numberOfFrames = 0; -ArrayList imageSequence = new ArrayList (); +PImage loadedFrame; PImage liveFrame; boolean weAreLive = true; boolean weAreInReplay = false; @@ -225,7 +226,7 @@ public void controlEvent(ControlEvent theEvent) { } else if (eventName == "Jump to Live View") { weAreLive = true; weAreInReplay = false; - currentFrame = imageSequence.size(); + currentFrame = numberOfFrames+1; frameSlider.setValue (currentFrame); } else if (eventName == "Delete Last Photo") { deleteFrame(); @@ -246,10 +247,8 @@ public void takePhoto () while (badCounter < MAX_BAD_FRAMES_BEFORE_GIVING_UP && success == false) { if (cam != null && cam.available() == true) { - PImage frame; cam.read(); - frame = cam.get(); - imageSequence.add (frame); + loadedFrame = cam.get(); numberOfFrames++; numFramesLabel.setText (nfc(numberOfFrames)); frameSlider.setRange (1, numberOfFrames); @@ -268,7 +267,7 @@ public void takePhoto () } parts[2] = createFilename (groupName, sceneNumber, numberOfFrames); String filename = join (parts,File.separator); - frame.save (filename); + loadedFrame.save (filename); lastFileName = filename; print ("Wrote frame to "); println (filename); @@ -311,19 +310,18 @@ private void playFrames () weAreLive = false; weAreInReplay = true; frameRate (fps); - currentFrame = 0; + currentFrame = 1; } private void deleteFrame () { - if (imageSequence.size() > 0) { + if (numberOfFrames > 0) { File f = new File (lastFileName); if (f.exists()) { f.delete(); } - imageSequence.remove (imageSequence.size() - 1); - currentFrame = imageSequence.size(); numberOfFrames--; + currentFrame = numberOfFrames; numFramesLabel.setText (nfc(numberOfFrames)); frameSlider.setRange (1, numberOfFrames); frameSlider.setValue (numberOfFrames); @@ -339,10 +337,9 @@ private void loadPrevious () void loadPreviousFromFile (File selection) { if (selection != null) { - imageSequence.clear(); numberOfFrames = 0; String pathToFile = selection.getPath(); - String filePath = pathToFile.substring(0,pathToFile.lastIndexOf(File.separator)); + filePath = pathToFile.substring(0,pathToFile.lastIndexOf(File.separator)); String filename = selection.toPath().getFileName().toString(); // We have to figure out the sequence: @@ -359,12 +356,8 @@ void loadPreviousFromFile (File selection) int loadingPhotoNumber = 1; boolean lastLoadWasSuccessful = true; while (lastLoadWasSuccessful) { - String loadFilename = filePath + File.separator + createFilename (groupName, sceneNumber, loadingPhotoNumber); - PImage frame = loadImage (loadFilename); - if (frame == null) { - lastLoadWasSuccessful = false; - } else { - imageSequence.add (frame); + lastLoadWasSuccessful = LoadFrame (loadingPhotoNumber); + if (lastLoadWasSuccessful == true) { numberOfFrames++; loadingPhotoNumber++; numFramesLabel.setText (nfc(numberOfFrames)); @@ -381,6 +374,39 @@ void loadPreviousFromFile (File selection) } +boolean LoadFrame (int frameNumber) +{ + boolean lastLoadWasSuccessful = false; + String groupName = groupnameField.getText(); + int sceneNumber; + + groupName = groupnameField.getText(); + String[] parts = new String[3]; + parts[0] = "Image Files"; + parts[1] = groupName.replaceAll("[^a-zA-Z0-9\\-_]", ""); + try { + sceneNumber = Integer.parseInt (sceneNumberField.getText()); + } catch (NumberFormatException e) { + // If they didn't give us an integer... + sceneNumber = 1; + } + parts[2] = createFilename (groupName, sceneNumber, frameNumber); + + String filename = join (parts,File.separator); + println (filename); + PImage newFrame = loadImage (filename); + + if (newFrame == null) { + lastLoadWasSuccessful = false; + } else { + loadedFrame = newFrame; + lastLoadWasSuccessful = true; + } + + return lastLoadWasSuccessful; +} + + void delay(int delay) { int time = millis(); @@ -399,37 +425,40 @@ void draw() { if (weAreLive) { boolean cameraHasGoodData = (cam != null && cam.available() == true); if (cameraHasGoodData) { - if (keyPressed && keyCode == CONTROL && imageSequence.size() > 0) { - image (imageSequence.get(imageSequence.size()-1), 260, 200); + if (keyPressed && keyCode == CONTROL && loadedFrame != null) { + image (loadedFrame, 260, 200); } else { cam.read(); liveFrame = cam.get(); image (liveFrame, 260, 200); - if (keyPressed && keyCode == SHIFT && imageSequence.size() > 0) { - PImage sourceImage = imageSequence.get(imageSequence.size()-1); - blend (imageSequence.get(imageSequence.size()-1), 0, 0, 640, 480, 260, 200, 640, 480, LIGHTEST); + if (keyPressed && keyCode == SHIFT && loadedFrame != null) { + blend (loadedFrame, 0, 0, 640, 480, 260, 200, 640, 480, LIGHTEST); } } } else if (liveFrame != null) { image (liveFrame, 260, 200); - if (keyPressed && keyCode == SHIFT && imageSequence.size() > 0) { - PImage sourceImage = imageSequence.get(imageSequence.size()-1); - blend (imageSequence.get(imageSequence.size()-1), 0, 0, 640, 480, 260, 200, 640, 480, LIGHTEST); + if (keyPressed && keyCode == SHIFT && loadedFrame != null) { + blend (loadedFrame, 0, 0, 640, 480, 260, 200, 640, 480, LIGHTEST); } } } else if (weAreInReplay) { // Show the current frame instead: - image (imageSequence.get(currentFrame), 260, 200); - currentFrame++; - frameSlider.setValue (currentFrame); - if (currentFrame >= imageSequence.size()) { - currentFrame = imageSequence.size() - 1; + boolean success = LoadFrame (currentFrame); + if (success == true) { + image (loadedFrame, 260, 200); + currentFrame++; + frameSlider.setValue (currentFrame); + } + if (currentFrame > numberOfFrames || success == false) { + weAreLive = true; weAreInReplay = false; + currentFrame = numberOfFrames+1; + frameSlider.setValue (currentFrame); frameRate (30); } } else { - if (currentFrame < imageSequence.size()) { - image (imageSequence.get(currentFrame), 260, 200); + if (currentFrame <= numberOfFrames && loadedFrame != null) { + image (loadedFrame, 260, 200); } else { // Just do nothing, I guess... }