太酷了!90行Python代码让微信开屏地球转起来(末尾送书)
点击上方蓝色小字,关注“涛哥聊Python”
重磅干货,第一时间送达
来自公众号:数据分析与统计学之美
1.微信地球
手机重启后打开微信的一瞬间,会看到一幅有名的图片,上面站着一个张小龙。
你可曾想过这样一个问题,如果上面那个地球转起来会是怎样?
2.效果图
效果简直不要太酷炫,我只能直呼太牛逼!那么这样一个酷炫的操作是怎么做出来的呢?我们接着往下看。
3.素材准备
这里共需要准备三个素材:1.地球表面素材;2.云图素材;3.微信地球的抠图素材。
1)地球表面素材
2)云图素材
3)微信地球的抠图素材
4.基本原理
基本的贴图方法在本博前面的文章《用python实现旋转地球》中讲过了,具体可以参考下面的链接,这里重点讲双层素材的动态效果。云图是灰度图,白色地方代表云层厚,黑色的地方代表那里云层薄,我们根据颜色设置不同的透明度。
https://blog.csdn.net/xiaorang/article/details/106692489
如果云图与地面的选择速度相同,会显得不自然,我们这里让云层旋转速度比地面旋转速度慢一半,产生相对运动的效果。
这样带来的问题是,地球旋转360°后云图只旋转了180°,必须加倍到720°才能实现连续运动。
具体的云层透明度设置,参数需根据实际效果进行调整。
5.GIF压缩
顺便给大家介绍一个比较好用的压缩GIF的在线工具,链接如下。
https://www.iloveimg.com/zh-cn/compress-image/compress-gif
直接生成的GIF动图有超过传输限制,无法上传,用此工具压缩后文件体积大幅缩小,但图片效果没有肉眼可以察觉的影响。
6.完整代码
分步骤的具体逻辑讲解,请看《用python实现旋转地球》这个文章,链接我们在上面已经展示,这里贴一下完整代码。
分步骤的具体逻辑讲解,请看《用python实现旋转地球》这个文章,链接我们在上面已经展示,这里贴一下完整代码。
from PIL import Image, ImageDraw
import math
import numpy as np
import imageiodef calcSphereXY2XYZ(px, py, maxHeight, longOffset):v0x= np.array(px)v0y= np.array(py)v03= np.subtract(v0x, maxHeight)v04= np.subtract(v0y, maxHeight)v1x= np.true_divide(v03, maxHeight)v1y= np.true_divide(v04, maxHeight)# print(max(v1x), min(v1x))v07= np.power(v1x,2)v08= np.power(v1y,2)v09= np.add(v07,v08)v0a= np.subtract(1,v09)v1z= np.power(v0a,1/2) # z# print('z:', max(v1z), min(v1z))v1lat= np.multiply(v1y, math.pi/2) # latv0lon= np.arctan2(v1z, -v1x) v1lon= np.add(v0lon, longOffset) # longv2lon= np.fmod(v1lon, math.pi*2) # longreturn v2lon, v1latdef calcShpereLatLong2XY(vlon, vlat, width, height):v3x0=np.multiply(vlon, width/2/math.pi)v3y0=np.multiply(vlat, height/math.pi)v3y1=np.add(v3y0, height/2)v3x2=v3x0.astype(np.integer)v3y2=v3y1.astype(np.integer)return v3x2, v3y2def getPic(a):# imgBack= Image.open('地球3.jpg')imgBack= Image.open('世界地球日地图_8K_2.jpg')imgCloud= Image.open('世界地球云地图_8K.jpg')width= imgBack.size[0]height= imgBack.size[1]imgBack= imgBack.convert('RGBA')arrayBack= np.array(imgBack)arrayCloud= np.array(imgCloud)circleSize= 508img2= Image.new('RGBA', (circleSize,circleSize))img= Image.new('RGBA', (circleSize,circleSize), 'black')w= img.size[0]h= img.size[1]pxList=[]pyList=[]for i in range(w):for j in range(h):r= math.sqrt((i-w/2)**2+(j-h/2)**2)if r255:c0=255c_alpha= int(c2[0]*0.9)c2= (c0,c0,c0,c_alpha)img2.putpixel((x,y), c2)r,g,b,a= img2.split()img.paste(img2, (0,0), mask=a)return imgif __name__=='__main__':frames=[]str1= '微信地球_mask.png'img1= Image.new('RGB', (750,1334))img2= Image.open(str1)for i in range(0, 720, 12):a= -i*math.pi/ 180img= getPic(a)img1.paste(img,(122,424))r,g,b,alpha=img2.split()img1.paste(img2, (0,0), mask=alpha)str1= 'temp%03d.png'%iprint(str1)img1.save(str1)im = imageio.imread(str1)frames.append(im)# img.show()imageio.mimsave('earth.gif', frames, 'GIF', duration=0.20) - EOF -
向大家推荐一个特别入门的零基础Python人工智能公开课
Python入门、零基础搞定毕业设计、最简单的人工智能大数据经典算法,极其简单好懂,每节课程都有干货案例。
观看地址
https://www.icourse163.org/course/CUEB-1450000234
https://www.bilibili.com/video/BV12p4y1X7JS/
课件下载
????长按上方二维码
回复「零基础」即可获取资料
其他
最后涛哥推荐下我的视频号,我从3月份开通了视频号,坚持录制80多期左右的视频了,不说每篇干货满满,有爬虫技术,有工具推荐,有软件开发技能、副业赚钱但都是原创用心输出,有些东西公众号看不到,视频号能看到,一来不足以成文,二来可以看看逗比涛哥。
今天是视频号78/100天打卡,公众号日更66/100天,加油呀! 推荐一本新书
《Python网络编程从入门到精通》从实际应用出发,详细介绍Python网络编程的相关知识与操作技能。全书分为3篇共计12章。1篇为基础篇, 介绍了Python编程的环境搭建、基本模块、数据库编程及测试驱动开发等内容,为读者学习网络编程做了一个很好的知 识铺垫;第2篇为核心篇,讲解了网络编程中HTTP服务器与客户端编程、Socket网络编程、Django框架应用、FTP、Telnet、POP3、SMTP、SNMP等知识,为网络编程奠定基础;第3篇为项目实战,以开发“实时在线互动聊天系统”和 “权限管理系统”两个应用案例介绍了。
????长按上方二维码
回复「网络」抽奖3本网络编程,7.27日20:00开奖,
中奖需要24小时联系我哦
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
