一次性筷子网站建设,怎么把网站做的更好,中国建筑网建设通查询证件网,大地资源在线资源免费观看今天我们来一个好玩儿的东西#xff0c;使用90行Python代码就可以让【微信第地球】转起来#xff0c;太有意思啦#xff01;
1.微信地球
手机重启后打开微信的一瞬间#xff0c;会看到一幅有名的图片#xff0c;上面站着一个张小龙。 你可曾想过这样一个问题#xff0c…今天我们来一个好玩儿的东西使用90行Python代码就可以让【微信第地球】转起来太有意思啦
1.微信地球
手机重启后打开微信的一瞬间会看到一幅有名的图片上面站着一个张小龙。 你可曾想过这样一个问题如果上面那个地球转起来会是怎样
2.效果图 效果简直不要太酷炫我只能直呼太牛逼那么这样一个酷炫的操作是怎么做出来的呢我们接着往下看。
3.素材准备
这里共需要准备三个素材1.地球表面素材2.云图素材3.微信地球的抠图素材。
1地球表面素材 2云图素材 3微信地球的抠图素材 4.基本原理
旋转地球之所以看起来是旋转的只是因为它上面显示的内容在变。其实起点只是一个圆。我们所做的只是把经纬度贴图中的像素以合理的方式贴到圆上去。然后再把一帧帧图片连接为GIF动图即可。
贴图的方法是 1、选择圆内的所有点。 2、计算每一点对应的经纬度。 3、从经纬度贴图上获取该经纬度对应的xy坐标 4、获取像素写入图片 5、制作GIF
重点讲双层素材的动态效果。云图是灰度图白色地方代表云层厚黑色的地方代表那里云层薄我们根据颜色设置不同的透明度。
如果云图与地面的选择速度相同会显得不自然我们这里让云层旋转速度比地面旋转速度慢一半产生相对运动的效果。
这样带来的问题是地球旋转360°后云图只旋转了180°必须加倍到720°才能实现连续运动。
具体的云层透明度设置参数需根据实际效果进行调整。
5.完整代码
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):v3x0np.multiply(vlon, width/2/math.pi)v3y0np.multiply(vlat, height/math.pi)v3y1np.add(v3y0, height/2)v3x2v3x0.astype(np.integer)v3y2v3y1.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 rcircleSize/2:pxList.append(i) pyList.append(j)nplon, nplat calcSphereXY2XYZ(pxList, pyList, h/2, a)nplon2, nplat2 calcSphereXY2XYZ(pxList, pyList, h/2, a/2)# nplon, nplat rotSphere(nplon, nplat, )npx, npy calcShpereLatLong2XY(nplon, nplat, width-1, height)npx2, npy2 calcShpereLatLong2XY(nplon2, nplat2, width-1, height)color arrayBack[npy, npx]color2 arrayCloud[npy2, npx2]for i in range(len(pxList)):x pxList[i]y pyList[i]cccolor[i]# print(cc)cc tuple(cc)img.putpixel((x,y), cc)c2 color2[i]c0 int(c2[0]*1.6)if c0255:c0255c_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), maska)return imgif __name____main__:frames[]str1 微信地球_mask.pngimg1 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,alphaimg2.split()img1.paste(img2, (0,0), maskalpha)str1 temp%03d.png%iprint(str1)img1.save(str1)im imageio.imread(str1)frames.append(im)# img.show()imageio.mimsave(earth.gif, frames, GIF, duration0.20) 最后这里免费分享给大家一份Python学习资料包含视频、源码。课件希望能帮到那些不满现状想提升自己却又没有方向的朋友也可以和我一起来学习交流呀。 编程资料、学习路线图、源代码、软件安装包等
看下方图片哦掉落↓↓↓
① Python所有方向的学习路线图清楚各个方向要学什么东西 ② 100多节Python课程视频涵盖必备基础、爬虫和数据分析 ③ 100多个Python实战案例学习不再是只会理论 ④ 华为出品独家Python漫画教程手机也能学习 ⑤ 历年互联网企业Python面试真题,复习时非常方便****