|
@@ -0,0 +1,49 @@
|
|
|
+#!/usr/bin/env python3
|
|
|
+from PIL import Image
|
|
|
+from math import sin, cos, pi
|
|
|
+
|
|
|
+
|
|
|
+def main():
|
|
|
+ bg = Image.open('./stars.png')
|
|
|
+ cookie = Image.open('./cookie.png').resize((100, 100))
|
|
|
+ cookie_mask = cookie.split()[0].point(lambda i: i != 0 and 255)
|
|
|
+ muffin = Image.open('./muffin.png').resize((100, 100))
|
|
|
+ muffin_mask = muffin.split()[0].point(lambda i: i != 0 and 255)
|
|
|
+ doughnut = Image.open('./doughnut.png').resize((100, 100))
|
|
|
+ doughnut_mask = doughnut.split()[0].point(lambda i: i != 0 and 255)
|
|
|
+
|
|
|
+ snacks = [cookie, muffin, doughnut]
|
|
|
+ masks = [cookie_mask, muffin_mask, doughnut_mask]
|
|
|
+ n = 150
|
|
|
+
|
|
|
+ def combine(t):
|
|
|
+ A = 0.1
|
|
|
+ w = 6*2*pi/n
|
|
|
+
|
|
|
+ bg_copy = bg.copy()
|
|
|
+
|
|
|
+ # left_c.paste(left, box=(offset, 0))
|
|
|
+ # right_c.paste(right, box=(-offset, 0))
|
|
|
+
|
|
|
+ N = 10
|
|
|
+ radius = 400
|
|
|
+ center = 450, 450
|
|
|
+ for i in range(N+1):
|
|
|
+ strain_x = 1 + A*sin(w*t)
|
|
|
+ strain_y = 1 - A*sin(w*t)
|
|
|
+ theta = i*2*pi/(N+1)
|
|
|
+ x = int(center[0] + strain_x*radius*cos(theta))
|
|
|
+ y = int(center[1] + strain_y*radius*sin(theta))
|
|
|
+ bg_copy.paste(snacks[i % 3], mask=masks[i % 3], box=(x, y))
|
|
|
+
|
|
|
+ # bg.show()
|
|
|
+ return bg_copy
|
|
|
+
|
|
|
+ # combine(0)
|
|
|
+ frames = [combine(i) for i in range(n)]
|
|
|
+
|
|
|
+ frames[0].save('snacks.gif', save_all=True, append_images=frames[1:], duration=int(1000/30), loop=0)
|
|
|
+
|
|
|
+
|
|
|
+if __name__ == '__main__':
|
|
|
+ main()
|