19行代码动态展示微信地图

  • 1、引言
  • 2、代码实战
    • 2.1 思路
    • 2.2 示例
      • 2.2.1 经纬度
      • 2.2.2 制作gif
  • 3、总结

1、引言

小屌丝:鱼哥, 最近在干啥嘞。
小鱼:干活呗, 不然能干啥。
小屌丝:嘿嘿…
小鱼:你这笑的, 怎么 那么 龌(wei)龊(suo)。
小屌丝:没有… 没有…
小鱼:别装了, 无事不登三宝殿的人, 说吧,你有啥事?
小屌丝:果然, 有什么瞒不过鱼哥。
小鱼:那是~ ! 也不看看我是谁~ !
小屌丝:我女神给我发一个动图,我不知道啥意思。
小鱼:啥动图,哪来看看。
小屌丝:就是这个。

小鱼:然后呢,
小屌丝:然后又发了一个图。
小鱼:啥图, 展示下。

小屌丝:鱼哥,你说这是啥意思呢?
小鱼:别慌,待我想一想。

小屌丝:鱼哥,想的怎么样了。
小鱼:别说, 我还真知道了
小屌丝:真的啊, 那快说说, 我的女神想要啥?
小鱼:当然是,旋转的动图了。

小屌丝:可以啊,鱼哥, 没想到,你竟然能get到我女神的想法。
小鱼:… 赶紧制作模型, 赶紧交差,不然赶不上2路公共汽车了。
小屌丝:我女神也没给我期限,你这咋这么着急?
小鱼:… 我的意思,待会 35号(技…师…)该下班了。
小屌丝:…

2、代码实战

2.1 思路

1、 准备素材

要想让地球转起来, 我们首选要做的准备素材。这里需要准备3个素材,如下:

  • 地球表面;
  • 云图;
  • 微信地球抠图;

2、实现原理
很简单,就是利用gif动图来实现的。

具体方法:

  • 选择图片上所有的点;
  • 计算每一个点对应的经纬度(经纬度是重点);
  • 获取经纬度的xy坐标;
  • 像素写入到图片中;
  • 制作gif动图,实现地球不停旋转。

2.2 示例

这里的难点,有两个,

  • 经纬度
  • gif制作

所以,我们单独分析这两个方法,然后再进行代码整合。

2.2.1 经纬度

获取经纬度对应的xy坐标

# -*- coding:utf-8 -*-
# @Time   : 2023-06-10
# @Author : Carl_DJ
"""
实现原理: 制作一个简单的坐标映射
"""def 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, v3y2

2.2.2 制作gif

代码示例

# -*- coding:utf-8 -*-
# @Time   : 2023-06-10
# @Author : Carl_DJ'''
实现功能:使用PIL、numpy等库,让微信登录界面的地球转起来。
'''from PIL import Image, ImageDraw
import math
import numpy as np
import imageio#获取三维坐标,这里用到的numpy,为了提升计算的速度
def calcXYZ(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)                                 # print('z:', max(v1z), min(v1z))v1lat= np.multiply(v1y, math.pi/2)                     v0lon= np.arctan2(v1z, -v1x)                             v1lon= np.add(v0lon, longOffset)                    v2lon= np.fmod(v1lon, math.pi*2)             return v2lon, v1lat#获取经纬度对应的xy坐标
def calcLongXY(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, v3y2# 获取像素点,并且把像素点写入到图片中
def getPic(a):# imgBack= Image.open('地球3.jpg')imgBack= Image.open('./data/地球日图片.jpg')imgCloud= Image.open('./data/地球云地图.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= calcXYZ(pxList, pyList, h/2, a)nplon2, nplat2= calcXYZ(pxList, pyList, h/2, a/2)# nplon, nplat= rotSphere(nplon, nplat, )npx, npy= calcXY(nplon, nplat, width-1, height)npx2, npy2= calcXY(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=[]str_path1= './data/微信地图.png'img1= Image.new('RGB', (750,1300))img2= Image.open(str_path1)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)str_path1= 'Demo.png'%iimg1.save(str_path1)im = imageio.imread(str_path1)frames.append(im)# img.show()imageio.mimsave('earth.gif', frames, 'GIF', duration=0.20)

运行结果

小屌丝:鱼哥,运行结果是啥样的呢?
小鱼:嘿嘿,这里留个彩蛋, 你自己运行下代码, 看看呗。

小屌丝:鱼哥,好事做到底啊。 你就直接把图放上来呗。
小鱼:那不行,不能什么都等着我喂到嘴里的。
小屌丝:那我来运行看看。

3、总结

看到这里,今天的分享就到这里 。
其实我们来回想一下,其实通篇的难点就2个,即:

  • 1、如何获取经纬度的xy坐标,并且把像素写入到图片中;
  • 2、GFI图片制作;

但是,针对GIF图片的制作, 你可以参照小鱼的这篇博文:

  • Python3,5行代码,制作Gif动图,太简单了。

关于 获取坐标经纬度, 你也可以参照小鱼的这篇博文:

  • Python3,19行代码,我把她的照片写入到Excel中,2022年伊始,她终于被我感动了。
  • Python3,为了给女神暗送秋波,我默默的写了一个图片字符画生成器,真香。

所以,看过这几篇,在回来从新看这段代码, 是不是就很简单了呢 。

我是小鱼

  • CSDN 博客专家
  • 阿里云 专家博主
  • 51CTO博客专家
  • 51认证讲师等
  • 认证金牌面试官
  • 职场面试及培训规划师
  • 国内多个主流技术社区的认证专家博主
  • 多款主流产品(阿里云等)测评一、二等奖获得者

我是小鱼,关注我,带你学习更多更专业更前沿的Python技术。

Python3, 19行代码,让微信登录页面地球转起来,涨见识了。相关推荐

  1. Python3,19行代码,我把她的照片写入到Excel中,2022年伊始,她终于被我感动了。

    19行代码,把图片写到如excel. 1.引言 2.代码实战 2.1 思路 2.2 文件准备 2.3 实战 2.3.1 安装 2.3.2 代码实战 3.总结 1.引言 小屌丝:鱼哥,新年快乐~ ~ 小 ...

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

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

  3. SAP系统和微信集成的系列教程之八:100行代码在微信公众号里集成地图搜索功能

    本系列的英文版Jerry写作于2017年,这个教程总共包含十篇文章,发表在SAP社区上. 系列目录 (1) 微信开发环境的搭建 (2) 如何通过微信公众号消费API (3) 微信用户关注公众号之后,自 ...

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

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

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

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

  6. 14W 行代码量的前端页面长什么样

    作者:sigmaliu,腾讯文档 AlloyTeam 开发工程师 0. 前言 腾讯文档列表页在不久前经历了一次完全重构后,首屏速度其实已经是不错.但是我们仍然可以引入 SSR 来进一步加快速度.这篇文 ...

  7. 微信公众号支付php demo,200行代码实现微信支付-公众号支付,不再踩坑,附:demo...

    开发微信支付需要认证服务号并且已经开通微信支付,获得微信支付商ID,设置apikey了的. 官方给了公众号支付的php源码SDK 但是这个SDK文件非常多,源码乱七八糟的,真的一开始接触的人拿着官方的 ...

  8. 如何用 30 行代码实现微信自动回复机器人?

    作者 | Ahab 责编 | 胡巍巍 写在前面 很多朋友对itchat非常感兴趣,近日又学到了itchat另一种有趣的玩法--微信自动回复机器人. 程序很简单仅仅三十行代码左右,实现了机器人自动与你的 ...

  9. 前端代码整理-迷你登录页面

    登录页面很多,但是我需要的是拿来即可用.不用重复造轮子的登录代码 我已经代码整理到一个页面 <!doctype html> <html> <head><met ...

最新文章

  1. 改用C++生成自动化数据表
  2. 初识Mysql(part19)--我需要知道的3条Mysql语句之组合查询
  3. 噪音声压和声功率的区别_南昌汽车隔音,深入了解汽车噪音的来源、危害以及解决方案...
  4. 安装OpenCL和AMD驱动程序
  5. 用开源代码如何建立网站_糖尿病患者找到开源并建立自己的医疗设备
  6. 牛客网 [编程题]餐馆
  7. Git笔记(28) 签署工作
  8. linux分区合并不损坏系统,不损坏数据的情况下 linux磁盘如何扩展 LVM格式
  9. 媒体查询Media Query
  10. 极简主义︱使用Turicreate进行快速图像分类迁移训练与预测(六)
  11. python分页技术
  12. luogu P3193 [HNOI2008]GT考试
  13. 【探索PowerShell 】【二】基本操作
  14. Socket 使用笔记与注意事项(一)
  15. [转]Redis几个认识误区
  16. informix使用得一些小常识
  17. 基于RFID的图书馆管理
  18. FaceNet源码解读2:史上最全的FaceNet源码使用方法和讲解(二)
  19. 第十二节:通信之WLAN(Miracast)
  20. 超详细的MySQL基本操作

热门文章

  1. 《软件过程与项目管理》复习思考问题清单
  2. 第三方物流管理系统的设计与实现
  3. Xpath的基本使用方法
  4. Javascript---获取系统时间,实现12小时制并判断上午或下午
  5. 08.OpenWrt-连接wifi网络
  6. ResultSet,PreparedStatement
  7. [翻译] Effective C++, 3rd Edition, Item 32: 确保 public inheritance 模拟 is-a(上)
  8. koa session
  9. Qt之qcustomplot背景色改变
  10. IX-Protected Dataplane Operating System解读