作者 | xiaorang

责编 | Aholiab

头图 | CSDN 下载自视觉中国

出品 | CSDN(ID:CSDNnews)

手机重启后打开微信的一瞬间,会看到一幅有名的图片,上面站着一个“张小龙”。

你可曾想过这样一个问题,如果上面那个地球转起来会是怎样?就像下面这样:

效果简直不要太酷炫,那么这样一个酷炫的操作是怎么做出来的呢?我们接着往下看。

这里共需要准备三样素材:

  1. 地球表面素材

  2. 云图素材

  3. 微信地球的抠图素材

地球表面素材如下所示:

云图素材如下所示:

微信地球抠图素材如下所示:

这里重点讲双层素材的动态效果。云图是灰度图,白色地方代表云层厚,黑色的地方代表那里云层薄,我们根据颜色设置不同的透明度。

如果云图与地面的选择速度相同,会显得不自然,我们这里让云层旋转速度比地面旋转速度慢一半,产生相对运动的效果。

这样带来的问题是,地球旋转360°后云图只旋转了180°,必须加倍到720°才能实现连续运动。

具体的云层透明度设置,参数需根据实际效果进行调整。

接下来是GIF压缩,顺便给大家介绍一个比较好用的GIF压缩工具iloveimg。用这个工具可以直接生成GIF动图,并且不会超过传输限制。用此工具压缩后文件体积大幅缩小,但图片效果没有肉眼可以察觉的影响。

那么,最关键的一步来了,我们该如何用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 r<circleSize/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]cc=color[i]# print(cc)cc= tuple(cc)img.putpixel((x,y), cc)c2= color2[i]c0= int(c2[0]*1.6)if c0>255: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) 

对Python感兴趣的同学,可以将上面代码down下来慢慢研究。通过对小项目的实现可以快速提升代码的实操能力。

你学会了吗?如有疑问欢迎在评论区留言。

更多精彩推荐
☞时隔 15 年,苹果的自研 ARM 芯片为何能取代 Intel 处理器?
☞从微信「拍一拍」,我想到了那些神奇的一行代码功能
☞AI 又进阶!除了鉴别 PS 图片,还能一键卸妆!
☞无代码开发到底是不是伪需求?
☞程序员端午炫富指南~
☞Spring 从入门到入土——AOP 就这么简单!| 原力计划
☞硬核!国外开发者用 25 美元做了个区块链警佩相机!
你点的每个“在看”,我都认真当成了喜欢

Python 90行代码让微信地球转起来,你也可以!| 原力计划相关推荐

  1. 90行代码让微信地球转起来,太酷了!(python实现)

    1.微信地球 手机重启后打开微信的一瞬间,会看到一幅有名的图片,上面站着一个 张小龙 . 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手 ...

  2. 90行代码让微信地球转起来,太酷了!(python实现)!

    1.微信地球 手机重启后打开微信的一瞬间,会看到一幅有名的图片,上面站着一个 张小龙 . 你可曾想过这样一个问题, 如果上面那个地球转起来会是怎样? 2.效果图 效果简直不要太酷炫,我只能直呼太牛逼! ...

  3. c++ int8_t转int_Python 90行代码让微信地球转起来,你也可以!| 原力计划

    作者 | xiaorang 责编 | Aholiab 头图 | CSDN 下载自视觉中国 出品 | CSDN(ID:CSDNnews) 手机重启后打开微信的一瞬间,会看到一幅有名的图片,上面站着一个& ...

  4. python旋转地球源代码_90行代码让微信地球转起来,太酷了!(python实现)

    原标题:90行代码让微信地球转起来,太酷了!(python实现) 点击图片,即可查看图书详情. 1.微信地球 手机重启后打开微信的一瞬间,会看到一幅有名的图片,上面站着一个 张小龙 . 你可曾想过这样 ...

  5. python画地球旋转代码_90行代码让微信地球转起来,太酷了!(python实现)

    原标题:90行代码让微信地球转起来,太酷了!(python实现) 点击图片,即可查看图书详情. 1.微信地球 手机重启后打开微信的一瞬间,会看到一幅有名的图片,上面站着一个 张小龙 . 你可曾想过这样 ...

  6. Python 10 行以内代码能有什么高端操作?| 原力计划

    作者 | ZackSock 来源 | CSDN博客 Python凭借其简洁的代码,赢得了许多开发者的喜爱.因此也就促使了更多开发者用Python开发新的模块,从而形成良性循环,Python可以凭借更加 ...

  7. Python 8行代码模拟鼠标自动删除微信收藏

    上回我们提到了用 pyuserinput 进行模拟键盘鼠标操作,结果发现很多同学都回复无法安装成功,即便安装成功了还是存在很多问题.确实,pyuserinput存在不少问题,包括其安装的pymouse ...

  8. python微信机器人_30行代码实现微信自动回复机器人

    30行代码实现微信自动回复机器人 一.写在前面 今天下午又学到了itchat另一种有趣的玩法---微信自动回复机器人. 程序很简单仅仅三十行代码左右,实现了机器人自动与你的微信好友聊天,下面是我的机器 ...

  9. 20行 Python 代码爬取王者荣耀全英雄皮肤 | 原力计划

    作者 | wangweijun 责编 | Elle 出品 | CSDN 博客 引言 王者荣耀大家都玩过吧,没玩过的也应该听说过,作为时下最火的手机MOBA游戏,咳咳,好像跑题了.我们今天的重点是爬取王 ...

最新文章

  1. java 建树源码_Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】...
  2. Illustrator+FontLab 进行字体设计教程
  3. 项目: 互动粒子仿真
  4. 实用:Google Chrome 键盘快捷键大全
  5. QT实现自定义3D材质
  6. python 量化交易_Quantsrat让R语言像Python一样进行策略回测和量化交易
  7. 940mx黑苹果驱动_超详细黑苹果安装图文教程送EFI配置合集及系统
  8. Spring Boot整合MongoDB实现增删改查
  9. vb6.0 生成exe被简称是木马_使用MSF渗透框架生成PHP木马并实现控制远程服务器
  10. python连续写入数据之间用什么隔开_elasticsearch之使用Python批量写入数据
  11. java 协变 逆变_JAVA中的协变与逆变
  12. win7休眠设置在哪里_win7系统如何关闭休眠模式--win7w.com
  13. python高级数据筛选的方法_使用python对多个txt文件中的数据进行筛选的方法
  14. 杀毒软件需要开源吗?
  15. RabbitMQ学习笔记:mandatory、publisher-confirms、publisher-return属性区别
  16. 【3D建模制作技巧分享】Maya如何给模型上色与渲染
  17. android ppt素材,华为ppt素材库
  18. SpringCloud禁用Eureka自我保护模式
  19. 还在为520礼物发愁吗?教你用python撩女朋友
  20. ArcGIS Engine基础(21)之面积测量(带内外环面积计算方法、地理坐标系和投影坐标系通用)

热门文章

  1. JS 对象转化为数组
  2. ASP.NET AJAX 学习笔记
  3. 常见机器学习算法分类及名称
  4. Kali在Vmware中通过Bridge联网
  5. [Linux] 编译 与 链接
  6. 全国大学生计算机技能应用大赛Java模拟题
  7. 【PyCharm】Pycharm使用技巧
  8. php判断ajax传入,利用PHP判断是否为AJAX请求代码
  9. 面向对象实现ATM功能
  10. python获取动态更新的数据_python3+beautifulsoup动态数据获取想要的内容