Last active
February 21, 2018 21:34
-
-
Save dellsystem/e05d4ae76c51f88b5f16d4e0cceeb354 to your computer and use it in GitHub Desktop.
See http://dellsystem.me/posts/time-slicing for details
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import argparse | |
import os | |
import subprocess | |
import sys | |
from wand.image import Color, Image, COMPOSITE_OPERATORS | |
from wand.drawing import Drawing | |
from wand.display import display | |
parser = argparse.ArgumentParser() | |
parser.add_argument('project', help="Path to directory containing raw/ folder") | |
parser.add_argument('--reverse', | |
help='Reverse the order of the images', | |
action='store_true') | |
parser.add_argument('--slices_per_image', type=int, default=3) | |
parser.add_argument('--starting_alpha', type=int, default=50) | |
args = parser.parse_args() | |
def make_translucent(image, alpha_percent): | |
with Image(width=image.width, | |
height=image.height, | |
background=Color("gray%d" % alpha_percent) | |
) as alpha: | |
image.composite_channel( | |
'default_channels', alpha, 'copy_opacity', 0, 0 | |
) | |
raw_dir = os.path.join(args.project, 'raw') | |
image_files = sorted(os.listdir(raw_dir), reverse=args.reverse) | |
num_files = len(image_files) | |
_, file_extension = os.path.splitext(image_files[0]) | |
first_image = Image(filename=os.path.join(raw_dir, image_files[0])) | |
width = first_image.width | |
height = first_image.height | |
cropped_width = width / num_files | |
print "Cropped width", cropped_width | |
slice_width = cropped_width / args.slices_per_image | |
print "Slice width", slice_width | |
alpha_delta = (100 - args.starting_alpha) / (args.slices_per_image - 1) | |
start_x = 0 | |
for image_file in image_files[1:]: | |
# First, get the piece of this image that will be used. | |
image_piece = Image(filename=os.path.join(raw_dir, image_file)) | |
end_x = start_x + cropped_width * 2 | |
image_piece.crop(start_x, 0, end_x, height) | |
for slice_i in xrange(args.slices_per_image): | |
slice_start_x = slice_i * slice_width | |
slice_alpha_percent = args.starting_alpha + alpha_delta * slice_i | |
slice_end_x = slice_start_x + slice_width | |
slice_image = image_piece.clone() | |
slice_image.crop( | |
slice_start_x, | |
0, | |
slice_end_x, | |
height | |
) | |
if slice_alpha_percent < 100: | |
make_translucent(slice_image, slice_alpha_percent) | |
first_image.composite( | |
image=slice_image, | |
left=start_x + slice_start_x, | |
top=0 | |
) | |
image_piece.crop(cropped_width, 0, cropped_width * 2, height) | |
first_image.composite( | |
image=image_piece, | |
left=start_x + cropped_width, | |
top=0 | |
) | |
start_x += cropped_width | |
filename = 'output_{slices}_{alpha}{ext}'.format( | |
slices=args.slices_per_image, | |
alpha=args.starting_alpha, | |
ext=file_extension | |
) | |
if args.reverse: | |
filename = 'reverse_' + filename | |
output_filename = os.path.join(args.project, filename) | |
print "Saved to %s" % output_filename | |
first_image.save(filename=output_filename) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment