找回密码
 会员注册
查看: 41|回复: 0

python写爱心代码爱心代码编程python可复制粘贴

[复制链接]

2万

主题

0

回帖

7万

积分

超级版主

积分
71772
发表于 2024-9-6 20:34:54 | 显示全部楼层 |阅读模式
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]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-10 14:01 , Processed in 1.232375 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表