前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何用python绘制一系列三维的逗比风格表情包

如何用python绘制一系列三维的逗比风格表情包

作者头像
用户1564362
发布2019-09-23 17:34:10
7920
发布2019-09-23 17:34:10
举报
文章被收录于专栏:飞总聊IT飞总聊IT
文章转载自公众号

Python爱好者社区 , 作者 盛光晓

表情包是当代社交生态中的战略性武器,既托起了友情的小船,又浮起了爱情的巨轮,还载起了亲情的航空母舰。在一个又一个宁静又不乏躁动的夜晚,此起彼伏的“老铁666”、“顶你上去”掀起了一阵又一阵的波澜。当你和别人斗图斗得天昏地暗、地动山摇的时候,你有没有想过,如果有一个三维的逗比表情包,你就可以对别人进行360度的全方位无死角嘲讽了!想到这里,你是不是由衷地在心里发出了豪爽而邪恶的笑声?

就像这样:

而现在,python就可以满足你这一不可告人的愿望!照例,我们用到的还是matplotlib的三维渲染。

首先,我们要有一张表情包的图片,最好是长度是宽度的两倍,这样的话,平面图片映射到球体上以后,变形会相对小一些。如果原始图片不符合要求,可以在画图工具里面重新调整大小,像下图这样:

那么,首先,表情包原图是这样的:

然后,我们重新生成一张长图,长度是上图的六倍,将上图的表情横着摆6个,代码和图片如下:

代码语言:javascript
复制
im=Image.open(r'origin.png')
   width,height=im.size
   result=Image.new(im.mode,(width*6,height))
for i in range(6):
            result.paste(im,box=(i*width,0))
   result.save('result.png')

接着,就是确定图片的显示范围,为了避免图片发生严重的变形,需要将图片映射到“低纬度”地区,我设定的是-pi/8到pi/8的范围。

用下面几行代码确定所有点的坐标:

代码语言:javascript
复制
#1128指的是长图的长度
u = np.linspace(0, 2*pi, 1128 * 1)
#94指的是长图的宽度
v = np.linspace(-pi / 8, pi / 8, 94 * 1)


x=a*np.outer(np.cos(u),np.cos(v))
y=a*np.outer(np.sin(u),np.cos(v))
z=b*np.outer(np.ones(np.size(u)),np.sin(v))

下文的最终绘制过程中,我们需要用到plot_surface函数,而该函数中有一个参数是facecolors,这个参数的意思就是为椭球的表面设置RGB值,我们就要在图片的各个像素点的RGB值和椭球表面的点之间建立一一对应的关系。代码如下:

代码语言:javascript
复制
bm=Image.open(r'result.png')
bm=np.array(bm)


colors=[]


for i in range(bm.shape[1]-1,-1,-1):
    item=[]
for j in range(bm.shape[0]-1,-1,-1):
        color="#{}{}{}".format(str.zfill(str(hex(bm[j][i][0]))[2:],2),str.zfill(str(hex(bm[j][i][1]))[2:],2),str.zfill(str(hex(bm[j][i][2]))[2:],2))
        item.append(color)
    colors.append(item)

最后,colors数组里面存储了所有椭球上面的点的RGB值。将colors赋值给facecolors就可以完成最后的绘制。

最终的结果大概是这样:

其他的表情也都可以试试。

说不定会有意外惊喜的哟

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 飞总聊IT 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档