From a7e231b6c985e856ea7eac370c2534ab9480510d Mon Sep 17 00:00:00 2001 From: Noah Rosamilia Date: Tue, 15 Aug 2017 00:59:39 -0400 Subject: [PATCH 1/2] Make proper command line program Use argparse to read options from the commandline Automatically detect frame size and speed based on source images --- rollingshutter.py | 63 ++++++++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 31 deletions(-) diff --git a/rollingshutter.py b/rollingshutter.py index e333154..7fbd17e 100644 --- a/rollingshutter.py +++ b/rollingshutter.py @@ -1,31 +1,32 @@ -def rs(folder,speed=1): - - from PIL import Image - import glob - - # ENTER YOUR DIRECTORIES AND FILE TYPE HERE - frame_dir = "/Users/mattparker/Documents/rollingshuttervideos/" + str(folder) + "/" - frame_file = "png" - output_dir = "/Users/mattparker/Documents/rollingshuttervideos/" - - width = 1920 - height = 1080 - - # Making our blank output frame - output_image = Image.new('RGB', (width, height)) - - - # let us go through the frames one at a time - - current_row = 0 - - for filename in glob.glob(frame_dir + "*." + frame_file): - frame = Image.open(filename) - new_line = frame.crop((0, current_row, width, current_row+speed)) - output_image.paste(new_line, (0,current_row)) - current_row += speed - - # and export the final frame - output_image.save(output_dir + 'output_image.png') - - return 'DONE' +from PIL import Image +import argparse +import glob + +parser = argparse.ArgumentParser(description = 'Fake a rolling shutter effect') +parser.add_argument('folder', help = 'Folder containing image files (named sequentially)') +parser.add_argument('-o', '--output', help = 'Desired output filename (default: out.png)', default = 'out.png') +parser.add_argument('-t', '--type', help = 'Filetype to look for in folder (default: png)', default = 'png') + +args = parser.parse_args() + +# ENTER YOUR DIRECTORIES AND FILE TYPE HERE +frames = [Image.open(img) for img in glob.glob(args.folder + '/*.' + args.type)] + +# Extract size from first frame +width, height = frames[0].size + +# Making our blank output frame +output_image = Image.new('RGB', (width, height)) + +# let us go through the frames one at a time + +speed = height/len(frames) +current_row = 0 + +for frame in frames: + new_line = frame.crop((0, int(current_row), width, int(current_row + speed))) + output_image.paste(new_line, (0, int(current_row))) + current_row += speed + +# and export the final frame +output_image.save(args.output) From 382f12f20e4b5bc6d6335d5dbb816fcbca9021eb Mon Sep 17 00:00:00 2001 From: Noah Rosamilia Date: Tue, 15 Aug 2017 01:23:27 -0400 Subject: [PATCH 2/2] Add progress bar --- rollingshutter.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/rollingshutter.py b/rollingshutter.py index 7fbd17e..4f7094f 100644 --- a/rollingshutter.py +++ b/rollingshutter.py @@ -1,6 +1,7 @@ from PIL import Image import argparse import glob +import sys parser = argparse.ArgumentParser(description = 'Fake a rolling shutter effect') parser.add_argument('folder', help = 'Folder containing image files (named sequentially)') @@ -20,13 +21,20 @@ # let us go through the frames one at a time -speed = height/len(frames) +total_frames = len(frames) +speed = height/total_frames current_row = 0 -for frame in frames: +for i, frame in enumerate(frames): new_line = frame.crop((0, int(current_row), width, int(current_row + speed))) output_image.paste(new_line, (0, int(current_row))) current_row += speed + i += 1 + sys.stdout.write('\r{:3d}% [{:73}]'.format(int(i/total_frames*100), '#'*int(i/total_frames*73))) + sys.stdout.flush() + +print() # and export the final frame output_image.save(args.output) +print("Saved output to '{}'".format(args.output))