当前位置: 首页 > 编程日记 > 正文

90行Python代码,让张小龙的微信地球转起来


作者 | xiaorang

来源 | 数据分析与统计学之美

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.完整代码

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) 推荐阅读
  • 图灵奖得主Judea Pearl:从“大数据革命”到“因果革命”

  • Python 玩出花儿了!一文教你用 Python 制作吃豆人游戏 | 附代码

  • AI又进阶!除了鉴别PS图片,还能一键卸妆

  • 时隔 15 年,苹果的自研 ARM 芯片为何能取代 Intel 处理器?

  • 从微信「拍一拍」,我想到了那些神奇的一行代码功能

  • 科普 | 哈希函数的过去、现在与未来

你点的每个“在看”,我都认真当成了AI

相关文章:

70.打印所有Spring boot载入的bean【从零开始学Spring Boot】

【从零开始学习Spirng Boot—常见异常汇总】 问题的提出&#xff1a; 我们在开发过程当中&#xff0c;我们可能会碰到这样的问题&#xff1a;No qualifying bean 就是我们定义的bean无法进行注入&#xff0c;那到底是什么原因呢&#xff0c;有时候挺难定位的&#xff0c;当然这…

了解 C# “.NET研究”4 中的 Dynamic 关键字

dynamic 关键字和动态语言运行时 (DLR) 是 C# 4 和 Microsoft .NET Framework 4 中的重大新增功能。 这些功能在宣布时就引起了人们的极大兴趣&#xff0c;并伴随着许多疑问。 同时人们也给出了很多答案&#xff0c;但这些答案现在已散布于各种文档以及各种技术博客和文章之中。…

“我,懂数据,不怕被裁”:这项核心能力到底有多香?

我见过市面上很多的 Python 讲解教程和书籍&#xff0c;他们大都这样讲 Python 的&#xff1a;先从 Python 的发展历史开始&#xff0c;介绍 Python 的基本语法规则&#xff0c;Python 的 list, dict, tuple 等数据结构&#xff0c;然后再介绍字符串处理和正则表达式&#xff0…

使请求管线内的所有模块尽可能高效

请求管线内的所有模块在每次请求中都有机会被运行。因此&#xff0c;当请求进入和离开模块时快速地触发代码至关重要&#xff0c;特别是在不使用模块功能的代码路径里。分别在使用及不使用模块和配置文件时执行吞吐量测试&#xff0c;对确定这些方法的执行速度非常有用。

PHP smarty缓存

缓存一个页面 test.php <?php//定义该页面缓存文件存放的路径 $filename "../cache/cachetest.html";//定义缓存有效期 $cachetime 5;//判断缓存文件是否存在 if(!file_exists($filename) || filemtime($filename)$cachetime<time()) {//开启内存缓存ob_sta…

在 Visual Basic .NET 或 JScript 代码中使用早期绑定

以往&#xff0c;开发人员喜欢使用 Visual Basic、VBScript 和 JScript 的原因之一就是它们所谓“无类型”的性质。变量不需要显式类型声明&#xff0c;并能够简单地通过使用来创建它们。当从一个类型到另一个类型进行分配时&#xff0c;转换将自动执行。不过&#xff0c;这种便…

Use MVS Dsbame convensions. windows下ftp.exe客户端上传错误

环境:主机 220-FTPD1 IBM FTP CS V1R11 at BT11 windows下的ftp.exe客户端 现象:windows下ftp.exe命令上传文件,报"Use MVS Dsbame convensions." 错误 原因: 主要是IBM FTP Server 文件系统的命名规范造成的: 8个基本字符 解决: 通过 cd 根目录.目录1.目录2----…

算法对建筑业的影响,不仅仅是画图

拿什么来拯救&#xff0c;这些奇葩的设计&#xff1f;奇葩造型位于英国伦敦芬乔奇街 20 号的一座摩天大楼&#xff0c;由于造型像「对讲机」&#xff0c;被取外号「对讲机大楼」。其实造型奇葩倒没什么&#xff0c;也有一些人觉得还挺好看。但问题是&#xff0c;建成之后&#…

如何参与团队合作?

现在&#xff0c;团队合作就是竞争力。随着市场竞争的日益激烈&#xff0c;企业更加强调团队精神&#xff0c;建立群体共识&#xff0c;以达到更高的工作效率。特别是有遇到大型项目时&#xff0c;想凭借一己之力去取得卓越的成果&#xff0c;可能非常困难。想必你也意识到&…

200 个工具分析机器学习十年:开源是大势,工程师是核心

【编者按】人工智能和机器学习经过十年多的发展&#xff0c;在过去的几年间&#xff0c;各类工具数量迎来了持续的爆发式的增长&#xff0c;机器学习也正式由科研走进工业生产阶段。本文作者 —— 来自硅谷一家初创公司的计算机科学家 Chip Huyen 梳理挖掘出 202 个机器学习工具…

将调用密集型的 COM 组件迁移到托管代码

.NET Framework 提供了一个简单的方法与传统的 COM 组件进行交互。其优点是可以在保留现有投资的同时利用新的平台。但是在某些情况下&#xff0c;保留旧组件的性能开销使得将组件迁移到托管代码是值得的。每一情况都是不一样的&#xff0c;决定是否需要迁移组件的最好方法是对…

性能优化工具 MVC Mini Profiler

MVC MiniProfiler是Stack Overflow团队设计的一款对ASP.NET MVC、WebForm 以及WCF 的性能分析的小程序。可以对一个页面本身&#xff0c;及该页面通过直接引用、Ajax、Iframe形式访问的其它页面进行监控,监控内容包括数据库内容&#xff0c;并可以显示数据库访问的SQL&#xff…

刷新UITableView

【from】http://www.superqq.com/blog/2015/08/18/ios-development-refresh-uitableview/ UITableView对于iOS开发者来说一定不会陌生&#xff0c;很有可能你的APP很多界面都用到它。关于UITableView的文章&#xff0c;想必已经不计其数&#xff0c;没事可以多看看。特别是UITa…

算术运算中隐式类型转换

转载于:https://www.cnblogs.com/strider/articles/2220313.html

高文、张钹、杨强隔空论道:AI精度与隐私的博弈

出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;AI时代&#xff0c;如何保护大众的隐私&#xff1f;以联邦学习为代表的AI技术能否实现AI协作&#xff0c;提升模型精度的同时&#xff0c;实现数据隐私的保护&#xff1f;中国如何抢占人工智能安全发展的制高点&#x…

避免单线程单元 (STA) COM 组件

默认情况下&#xff0c;ASP.NET 不允许任何 STA COM 组件在页面内运行。若要运行它们&#xff0c;必须在 .aspx 文件内将 ASPCompattrue 属性包含在 Page 指令中。这样就将执行用的线程池切换到 STA 线程池&#xff0c;而且使 HttpContext 和其他内置对象可用于 COM 对象。前者…

将 SQL Server 存储过程用于数据访问

在 .NET Framework 提供的所有数据访问方法中&#xff0c;基于 SQL Server 的数据访问是生成高性能、可缩放 Web 应用程序的推荐选择。使用托管 SQL Server 提供程序时&#xff0c;可通过使用编译的存储过程而不是特殊查询获得额外的性能提高。

centos下安装apache + subversion(转)

目录&#xff1a; 一.安装apr跟apr-util 二.安装apache服务器 三. 安装subversion 四. 配置subversion 五. 配置apache的httpd.conf 六. 验证安装 七.导入数据到资料库八.版本库服务器的同步&#xff08;新加入的&#xff09; 附&#xff1a;安装过程中遇到的问题 一.安装apr、…

真香!3个月0基础转型大厂数据分析师,他做对了什么?

年初的黑天鹅打乱了我的求职阵脚&#xff0c;专业不对口&#xff0c;无实习经验&#xff0c;在求职路上的竞争优势几乎为0&#xff0c;然而&#xff0c;开启自救模式后&#xff0c;我顺利成为了头条数据分析师&#xff0c;下面我就讲讲人生是怎么开挂的。随着人工智能普及&…

OpenStack快速入门

OpenStack云计算快速入门&#xff08;1&#xff09;该教程基于Ubuntu12.04版&#xff0c;它将帮助读者建立起一份OpenStack最小化安装。我是五岳之巅&#xff0c;翻译中多采用意译法&#xff0c;所以个别词与原版有出入&#xff0c;请大家谅解。我不是英语专业&#xff0c;我觉…

将 SqlDataReader 类用于快速只进数据游标

SqlDataReader 类提供了一种读取从 SQL Server 数据库检索的只进数据流的方法。如果当创建 ASP.NET 应用程序时出现允许您使用它的情况&#xff0c;则 SqlDataReader 类提供比 DataSet 类更高的性能。情况之所以这样&#xff0c;是因为 SqlDataReader 使用 SQL Server 的本机网…

微软小冰从上海音乐学院音工系毕业,师从于阳、陈世哲

6月29日&#xff0c;经上海音乐学院音乐工程系评定&#xff0c;人工智能微软小冰和她的人类同学——上音音乐工程系音乐科技专业毕业生一起毕业&#xff0c;并授予微软小冰上海音乐学院音乐工程系2020届“荣誉毕业生”称号。微软小冰和上海音乐学院的毕业生们一起参加了于6月29…

Typedef用法学习

不管实在C还是C代码中&#xff0c;typedef这个词都不少见&#xff0c;当然出现频率较高的还是在C代码中。typedef与#define有些相似&#xff0c;但更多的是不同&#xff0c;特别是在一些复杂的用法上&#xff0c;就完全不同了&#xff0c;看了网上一些C/C的学习者的博客&#x…

开发板tftp:timeout问题

想要从PC上面tftp文件的时候遇到了tftp:timeout的问题&#xff1a; >: tftp -gr gprsapp 192.168.1.38tftp: timeout 检查了网络&#xff0c;可以ping的通PC。PC的tftp服务器也已经打开了&#xff0c;测试从开发板上面向PC上tftp传送数据也是可以的&#xff1a;说明开发板上…

选择适合页面或应用程序的数据查看机制

根据您选择在 Web 窗体页显示数据的方式&#xff0c;在便利和性能之间常常存在着重要的权衡。例如&#xff0c;DataGrid Web 服务器控件可能是一种显示数据的方便快捷的方法&#xff0c;但就性能而言它的开销常常是最大的。在某些简单的情况下&#xff0c;您通过生成适当的 HTM…

Android强制设置横屏或竖屏

全屏 在Activity的onCreate方法中的setContentView(myview)调用之前添加下面代码requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置全屏 横屏 …

免费直播:1小时带你体验Python车牌识别实战

Python基础学会了&#xff0c;实战又是爬虫&#xff1f;太枯燥&#xff1f;别无聊&#xff0c;CSDN学院邀请章秀淞老师开设技术直播课&#xff1a;1小时带你体验车牌识别实战。让你从众多车中&#xff0c;能用Python技术找到夏树上的那辆叔叔的奔驰车牌&#xff08;玩笑&#x…

centos上tensorflow一键安装脚本

鉴于tensorflow在centos上安装相当麻烦,特地制作了一个脚本方便以后移植到其它机器上,脚本含有其它python常用包: #! /bin/bash sudo yum install -y gcc g gtk-devel libjpeg-devel libtiff-devel jasper-devel libpng-devel zlib-devel cmake unzip sqlite-devel readline-…

谷歌AI专家爆料:90%的人都不知道,写不出好代码,是输在了这点上!

工作压力大、大牛实力碾压&#xff0c;、外行人的偏见......2020年&#xff0c;程序员的心很累&#xff01;而Python和AI的初学者&#xff0c;心更累&#xff01;最近几年&#xff0c;我看过市面上很多 Python和人工智能的教程和书籍&#xff0c;它们大都这样讲&#xff1a;先从…

只要可能,就缓存数据和页输出

ASP.NET 提供了一些简单的机制&#xff0c;它们会在不需要为每个页请求动态计算页输出或数据时缓存这些页输出或数据。另外&#xff0c;通过设计要进行缓存的页和数据请求&#xff08;特别是在站点中预期将有较大通讯量的区域&#xff09;&#xff0c;可以优化这些页的性能。与…