47 lines
1.3 KiB
Python
47 lines
1.3 KiB
Python
|
from PIL import Image
|
||
|
import os
|
||
|
import sys
|
||
|
import operator
|
||
|
import subprocess
|
||
|
import shutil
|
||
|
|
||
|
def extract_frames(destination):
|
||
|
os.makedirs(destination, exist_ok=True)
|
||
|
subprocess.run(["ffmpeg", "-i", "aurora.mp4", "frames/out-%03d.png"])
|
||
|
print()
|
||
|
|
||
|
def parse_frame(file):
|
||
|
img = Image.open(file)
|
||
|
pix = img.load()
|
||
|
return img.size, pix
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
|
||
|
output_directory = "frames"
|
||
|
pixel_sum = None
|
||
|
count = 0
|
||
|
|
||
|
extract_frames(output_directory)
|
||
|
for file in sorted(os.listdir(output_directory)):
|
||
|
if file.endswith(".png"):
|
||
|
sys.stdout.write(f"\rAnalyzing: {file}")
|
||
|
(width, height), pix = parse_frame(os.path.join(output_directory, file))
|
||
|
if pixel_sum is None:
|
||
|
pixel_sum = [[(0,0,0) for y in range(height)] for x in range(width)]
|
||
|
|
||
|
for x in range(width):
|
||
|
for y in range(height):
|
||
|
pixel_sum[x][y] = tuple(map(operator.add, pixel_sum[x][y], pix[x,y]))
|
||
|
|
||
|
count += 1
|
||
|
|
||
|
print("\nComposing new image")
|
||
|
img = Image.new("RGB", (width, height))
|
||
|
pix = img.load()
|
||
|
|
||
|
for x in range(width):
|
||
|
for y in range(height):
|
||
|
pix[x,y] = tuple(map(operator.floordiv, pixel_sum[x][y], [count] * 3))
|
||
|
|
||
|
img.save(f"result.png")
|
||
|
shutil.rmtree(output_directory)
|