|
python写爱心代码【爱心代码编程python可复制粘贴】python程序代码:heart.pyfrommathimportcos,piimportnumpyasnpimportcv2importos,glob classHeartSignal: def__init__(self,curve="heart",title="LoveU",frame_num=20,seed_points_num=2000,seed_num=None,highlight_rate=0.3, background_img_dir="",set_bg_imgs=False,bg_img_scale=0.2,bg_weight=0.3,curve_weight=0.7,frame_width=1080,frame_height=960,scale=10.1, base_color=None,highlight_points_color_1=None,highlight_points_color_2=None,wait=100,n_star=5,m_star=2): super().__init__() self.curve=curve self.title=title self.highlight_points_color_2=highlight_points_color_2 self.highlight_points_color_1=highlight_points_color_1 self.highlight_rate=highlight_rate self.base_color=base_color self.n_star=n_star self.m_star=m_star self.curve_weight=curve_weight img_paths=glob.glob(background_img_dir+"/*") self.bg_imgs=[] self.set_bg_imgs=set_bg_imgs self.bg_weight=bg_weight ifos.path.exists(background_img_dir)andlen(img_paths)>0andset_bg_imgs: forimg_pathinimg_paths: img=cv2.imread(img_path) self.bg_imgs.append(img) first_bg=self.bg_imgs[0] width=int(first_bg.shape[1]*bg_img_scale) height=int(first_bg.shape[0]*bg_img_scale) first_bg=cv2.resize(first_bg,(width,height),interpolation=cv2.INTER_AREA) #对齐图片,自动裁切中间 new_bg_imgs=[first_bg,] forimginself.bg_imgs[1:]: width_close=abs(first_bg.shape[1]-img.shape[1])first_bg.shape[0]: crop_num=img.shape[0]-first_bg.shape[0] crop_top=crop_num//www.diyiyuanma.cn2 crop_bottom=crop_num-crop_top img=np.delete(img,range(crop_top),axis=0) img=np.delete(img,range(img.shape[0]-crop_bottom,img.shape[0]),axis=0) elifimg.shape[0]first_bg.shape[1]: crop_num=img.shape[1]-first_bg.shape[1] crop_top=crop_numwww.vbjcw.cn//2 crop_bottom=crop_num-crop_top img=np.delete(img,range(crop_top),axis=1) img=np.delete(img,range(img.shape[1]-crop_bottom,img.shape[1]),axis=1) elifimg.shape[1]0部分的图形到3、4象限 y=-(14*np.cos(t)-4*np.cos(2*t)-2*np.cos(3*t)-np.cos(trans*t)) ign_area=0.15 center_ids=np.where((x>-ign_area)&(x0.32: x,y=np.delete(x,center_ids),np.delete(y,center_ids) #删除稠密部分的扩散,为了美观 #放大 x*=scale y*=scale #移到画布中央 x+=self.center_x y+=self.center_y #原心形方程 #x=15*(sin(t)**3) #y=-(14*cos(t)-4*cos(2*t)-2*cos(3*t)-cos(3*t)) returnx.astype(int),y.astype(int) defbutterfly_function(self,t,frame_idx=0,scale=5.2): """ 图形函数 :paramframe_idx: :paramscale:放大比例 :paramt:参数 :return:坐标 """ #基础函数 #t=t*pi p=np.exp(np.sin(t))-2.5*np.cos(4*t)+np.sin(t)**5 x=5*p*np.cos(t) y=-5*p*np.sin(t) #放大 x*=scale y*=scale #移到画布中央 x+=self.center_x y+=self.center_y returnx.astype(int),y.astype(int) defstar_function(self,t,frame_idx=0,scale=5.2): n=self.n_star/self.m_star p=np.cos(pi/n)/np.cos(pi/n-(t%(2*pi/n))) x=15*p*np.cos(t) y=15*p*np.sin(t) #放大 x*=scale y*=scale #移到画布中央 x+=self.center_x y+=self.center_y returnx.astype(int),y.astype(int) defshrink(self,x,y,ratio,offset=1,p=0.5,dist_func="uniform"): """ 带随机位移的抖动 :paramx:原x :paramy:原y :paramratio:缩放比例 :paramp: :paramoffset: :return:转换后的x,y坐标 """ x_=(x-self.center_x) y_=(y-self.center_y) force=1/((x_**2+y_**2)**p+1e-30) dx=ratio*force*x_ dy=ratio*force*y_ defd_offset(x): ifdist_func=="uniform": returnx+np.random.uniform(-offset,offset,size=x.shape) elifdist_func=="norm": returnx+offset*np.random.normal(0,1,size=x.shape) dx,dy=d_offset(dx),d_offset(dy) returnx-dx,y-dy defscatter(self,x,y,alpha=0.75,beta=0.15): """ 随机内部扩散的坐标变换 :paramalpha:扩散因子-松散 :paramx:原x :paramy:原y :parambeta:扩散因子-距离 :return:x,y新坐标 """ ratio_x=-beta*np.log(np.random.random(x.shape)*alpha) ratio_y=-beta*np.log(np.random.random(y.shape)*alpha) dx=ratio_x*(x-self.center_x) dy=ratio_y*(y-self.center_y) returnx-dx,y-dy defperiodic_func(self,x,x_num): """ 跳动周期曲线 :paramp:参数 :return:y """ #可以尝试换其他的动态函数,达到更有力量的效果(贝塞尔?) defori_func(t): returncos(t) func_period=2*pi returnori_func(x/x_num*func_period) defgen_points(self,points_num,frame_idx,shape_func): #用周期函数计算得到一个因子,用到所有组成部件上,使得各个部分的变化周期一致 cy=self.periodic_func(frame_idx,self.frame_num) ratio=10*cy #图形 period=2*pi*self.m_starifself.curve=="star"else2*pi seed_points=np.linspace(0,period,points_num) seed_x,seed_y=shape_func(seed_points,frame_idx,scale=self.scale) x,y=self.shrink(seed_x,seed_y,ratio,offset=2) curve_width,curve_height=int(x.max()-x.min()),int(y.max()-y.min()) self.main_curve_width=max(self.main_curve_width,curve_width) self.main_curve_height=max(self.main_curve_height,curve_height) point_size=np.random.choice([1,2],x.shape,replace=True,p=[0.5,0.5]) tag=np.ones_like(x) defdelete_points(x_,y_,ign_area,ign_prop): ign_area=ign_area center_ids=np.where((x_>self.center_x-ign_area)&(x_0andself.set_bg_imgs: frame=cv2.addWeighted(self.bg_imgs[i%len(self.bg_imgs)],self.bg_weight,frame,self.curve_weight,0) cv2.imshow(self.title,frame) cv2.waitKey(self.wait) if__name__=='__main__': importyaml settings=yaml.load(open("./settings.yaml","r",encoding="utf-8"),Loader=yaml.FullLoader) ifsettings["wait"]==-1: settings["wait"]=int(settings["period_time"]/settings["frame_num"]) delsettings["period_time"] times=settings["times"] delsettings["times"] heart=HeartSignal(seed_num=5201314,**settings) heart.draw(times)其中也要到这个py文件的相同的文件夹里引入settings.yaml文件:#颜色:RGB三原色数值0~255#设置高光时,尽量选择接近主色的颜色,看起来会和谐一点 #视频里的蓝色调#base_color:#主色 默认玫瑰粉# -30# -100# -100#highlight_points_color_1:#高光粒子色1默认淡紫色# -150# -120# -220#highlight_points_color_2:#高光粒子色2默认淡粉色# -128# -140# -140 base_color:#主色 默认玫瑰粉 -228 -100 -100highlight_points_color_1:#高光粒子色1默认淡紫色 -180 -87 -200highlight_points_color_2:#高光粒子色2默认淡粉色 -228 -140 -140 period_time:1000*2 #周期时间,默认1.5s一个周期times:5#播放周期数,一个周期跳动1次frame_num:24 #一个周期的生成帧数wait:60 #每一帧停留时间,设置太短可能造成闪屏,设置-1自动设置为period_time/frame_numseed_points_num:2000 #构成主图的种子粒子数,总粒子数是这个的8倍左右(包括散点和光晕)highlight_rate:0.2#高光粒子的比例frame_width:720 #窗口宽度,单位像素,设置背景图片后失效frame_height:640 #窗口高度,单位像素,设置背景图片后失效scale:9.1 #主图缩放比例curve:"butterfly" #图案类型:heart,butterfly,starn_star:7#n-角型/星,如果curve设置成star才会生效,五角星:n-star:5,m-star:2m_star:3#curve设置成star才会生效,n-角形m-star都是1,n-角星m-star大于1,比如七角星:n-star:7,m-star:2或3title:"LoveLiXun" #仅支持字母,中文乱码background_img_dir:"src/center_imgs"#这个目录放置背景图片,建议像素在400X400以上,否则可能报错,如果图片实在小,可以调整上面scale把爱心缩小set_bg_imgs:false#true或false,设置false用默认黑背景bg_img_scale:0.6#0-1,背景图片缩放比例bg_weight:0.4#0-1,背景图片权重,可看做透明度吧curve_weight:1#同上 #========================推荐参数:直接复制数值替换上面对应参数==================================#蝴蝶,报错很可能是蝴蝶缩放大小超出窗口宽和高#curve:"butterfly"#frame_width:800#frame_height:720#scale:60#base_color:[100,100,228]#highlight_points_color_1:[180,87,200]#highlight_points_color_2:[228,140,140]
|
|