# DIY 雪花特效（一）

```"""
Created on Sat Dec 15 10:15:18 2019
@author: wangsp
"""
import numpy as np
from matplotlib import pyplot as plt
import cv2
import pickle
import imageio
from random import randint,normalvariate

def create_gif(frames, gif_name,duration=0.3,reverse=False):
if reverse: frames.sort(reverse=True)
imageio.mimsave(gif_name,frames,"GIF",duration=duration)
return frames

H,W,C = BG.shape
frame  = BG.astype(np.uint16)
frames = []

class Snow:
def __init__(self,type_,x0,y0,speed0,scale):
self.scale = scale
#type_ : from 1 to 16
self.data = self.get_snow(type_)
self.x = x0
self.y = y0
self.speed = speed0

def get_snow(self, type_):
with open("snow%d.data"%type_,"rb") as f:
#缩小一点
self.h,self.w = data.shape
data = cv2.resize(data,(int(self.h*self.scale),int(self.w*self.scale)))

self.h,self.w = data.shape
snow = np.zeros((self.h,self.w,3),dtype = np.uint8)
snow[data==1] = np.array([255,255,255])
return snow

def update(self): #动画效果
global frames, frame

c = self.w%2 #compensation, 偶数0， 奇数1
#restore
if self.y < self.h:
frame[0:self.y, self.x-int(self.w/2):self.x+int(self.w/2)+c] = BG[0:self.y,self.x-int(self.w/2):self.x+int(self.w/2)+c]
elif self.y < H:
frame[self.y-self.h:self.y, self.x-int(self.w/2):self.x+int(self.w/2)+c]= BG[self.y-self.h:self.y,self.x-int(self.w/2):self.x+int(self.w/2)+c]
elif self.y < H + self.h:
frame[self.y-self.h:, self.x-int(self.w/2):self.x+int(self.w/2)+c] = BG[self.y-self.h:,self.x-int(self.w/2):self.x+int(self.w/2)+c]
else:
pass

self.x += 0
self.y += self.speed
if self.y < self.h:
frame[0:self.y, self.x-int(self.w/2):self.x+int(self.w/2)+c] += self.data[self.h-self.y:,:]
elif self.y < H:
frame[self.y-self.h:self.y, self.x-int(self.w/2):self.x+int(self.w/2)+c] += self.data
elif self.y < H + self.h:
frame[self.y-self.h:, self.x-int(self.w/2):self.x+int(self.w/2)+c] += self.data[:H-(self.y-self.h),:]
else:
self.y = 0
frame[frame>255] = 255

n_snows = randint(100,120) # include both ends
snows  = []
for i in range(n_snows):
type_ = randint(1,16) #include both ends
x0 = randint(10,W-10)
y0 = randint(0,H)
speed = int(normalvariate(3,0.5))
scale = normalvariate(0.02,0.005)
snow = Snow(type_,x0, y0, speed,scale)
snows.append(snow)

n_frames = 30 #因为公众号只能穿5M以下的图，所以帧数弄少一点
for n in range(n_frames):
for i in range(n_snows):
snows[i].update()
frames.append(frame.astype(np.uint8))

create_gif(frames,"snow_plum_5M.gif",0.01) #创建GIF```

0 条评论

• ### PyQt5 对话框 数据验证

本篇介绍PyQt5对话框的数据合法性的验证。有两种验证方式：预防式验证（preventative）和 提交后验证 (post-mortem)。预防式验证适合于单...

• ### PyQt5 非模态对话框(apply 型)

如果希望用户可以重复更改对话框中的参数并能马上看到修改结果，那么就要使用非模态对话框，这样用户就可以按照他们喜欢的方式来持续不断地修改数据并验证修改的结果了。

• ### PyQt5 多文档窗口界面

本篇介绍多文档窗口界面的写法。代码中并未实现关闭窗口前文档未保存的提醒对话框，因为之前已有介绍。

• ### Python魔术方法-Magic Method

目录[-] 介绍 在Python中，所有以“__”双下划线包起来的方法，都统称为“Magic Method”,例如类的初始化方法 __init__ ,Pyt...

• ### Python魔法方法指南

什么是魔法方法呢？它们在面向对象的Python的处处皆是。它们是一些可以让你对类添加“魔法”的特殊方法。 它们经常是两个下划线包围来命名的（比如 __init_...

• ### python 长连接 mysql数据库

python链接mysql中没有长链接的概念，但我们可以利用mysql的ping机制，来实现长链接功能

• ### Seleninum&PhamtomJS爬取煎蛋网妹子图

mylog.py  日志模块，记录一些爬取过程中的信息,在大量爬取的时候，没有log帮助定位，很难找到错误点

• ### 高效处理流量加解密——Burpy

先来地址：Github: https://github.com/mr-m0nst3r/Burpy

• ### Tiknter例子3

============================================