From 2c7b6f20b9b9abfd541cbc4cb781a60e235608e1 Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Thu, 21 Apr 2016 14:26:14 -0700 Subject: Go back to the old ear-wiggling Android animation. But keep the new code so we can easily test new animations when we have them. This change includes tbao's de-interlace script, plus a one-liner that's necessary to play the animation at the correct speed when there's no progress bar showing. (This was always a bug, it's just way more noticeable when your animation only has 7 frames.) Bug: http://b/28316654 Bug: http://b/26548285 Change-Id: I32c601c352d6be235d1b44f14fca7e125defd77d --- interlace-frames.py | 62 +++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 48 insertions(+), 14 deletions(-) mode change 100644 => 100755 interlace-frames.py (limited to 'interlace-frames.py') diff --git a/interlace-frames.py b/interlace-frames.py old mode 100644 new mode 100755 index 3e777b470..6b435aa90 --- a/interlace-frames.py +++ b/interlace-frames.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python # Copyright (C) 2014 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,19 +14,16 @@ # limitations under the License. """ -Script to take a set of frames (PNG files) for a recovery animation and turn -it into a single output image which contains the input frames interlaced by -row. Run with the names of all the input frames on the command line. Specify -the name of the output file with -o (or --output), and optionally specify the -number of frames per second (FPS) with --fps (default: 20). - -e.g. -interlace-frames.py --fps 20 --output output.png frame0.png frame1.png frame3.png +Script to take a set of frames (PNG files) for a recovery animation +and turn it into a single output image which contains the input frames +interlaced by row. Run with the names of all the input frames on the +command line, in order, followed by the name of the output file. """ from __future__ import print_function import argparse +import os.path import sys try: import Image @@ -35,7 +33,7 @@ except ImportError: sys.exit(1) -def interlace(output, fps, inputs): +def interlace(output, inputs): frames = [Image.open(fn).convert("RGB") for fn in inputs] assert len(frames) > 0, "Must have at least one input frame." sizes = set() @@ -60,21 +58,57 @@ def interlace(output, fps, inputs): meta = PngImagePlugin.PngInfo() meta.add_text("Frames", str(N)) - meta.add_text("FPS", str(fps)) out.save(output, pnginfo=meta) +def deinterlace(output, input): + # Truncate the output filename extension if it's '.png'. + if os.path.splitext(output)[1].lower() == '.png': + output = output[:-4] + + img2 = Image.open(input) + print(img2.mode) + palette = img2.getpalette() + img = img2.convert("RGB") + num_frames = int(img.info.get('Frames', 1)) + print('Found %d frames in %s.' % (num_frames, input)) + assert num_frames > 0, 'Invalid Frames meta.' + + # palette = img.getpalette() + print(palette) + + width, height = img.size + height /= num_frames + for k in range(num_frames): + out = Image.new('RGB', (width, height)) + out.info = img.info + for i in range(width): + for j in range(height): + out.putpixel((i, j), img.getpixel((i, j * num_frames + k))) + # out.putpalette(img.getpalette(), rawmode='RGB') + out2 = out.convert(mode='P', palette=palette) + #out2 = out + print(out2.mode) + # out2.putpalette(palette) + filename = '%s%02d.png' % (output, k) + out2.save(filename) + print('Frame %d written to %s.' % (k, filename)) + + def main(argv): - parser = argparse.ArgumentParser() - parser.add_argument('--fps', default=20) + parser = argparse.ArgumentParser(description='Parse') + parser.add_argument('--deinterlace', '-d', action='store_true') parser.add_argument('--output', '-o', required=True) parser.add_argument('input', nargs='+') args = parser.parse_args(argv) - interlace(args.output, args.fps, args.input) + if args.deinterlace: + # args.input is a list, and we only process the first when deinterlacing. + deinterlace(args.output, args.input[0]) + else: + interlace(args.output, args.input) if __name__ == '__main__': main(sys.argv[1:]) - -- cgit v1.2.3