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

本文介绍了如何利用Python和matplotlib创建三维表情包。通过调整图片尺寸,映射到球体表面,并设定显示范围,最终使用plot_surface函数绘制出360度的逗比风格表情包。
摘要由CSDN通过智能技术生成

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

就像这样:

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

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

 

 

 

 

 

Python资源共享群:484031800

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

 

 

 

 

 

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

<span><span style="font-size: 15px;letter-spacing: 1px;">im=Image.open(r'origin.png')</span></span>

<span><span style="font-size: 15px;letter-spacing: 1px;"> width,height=im.size</span></span>

<span><span style="font-size: 15px;letter-spacing: 1px;"> result=Image.new(im.mode,(width*6,height))</span></span>

<span><span style="font-size: 15px;letter-spacing: 1px;">for i in range(6):</span></span>

<span><span style="font-size: 15px;letter-spacing: 1px;"> result.paste(im,box=(i*width,0))</span></span>

<span><span style="font-size: 15px;letter-spacing: 1px;"> result.save('result.png')</span></span>

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

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

<span><span style="font-size: 15px;letter-spacing: 1px;">#1128指的是长图的长度</span></span>

<span><span style="font-size: 15px;letter-spacing: 1px;">u = np.linspace(0, 2*pi, 1128 * 1)</span></span>

<span><span style="font-size: 15px;letter-spacing: 1px;">#94指的是长图的宽度</span></span>

<span><span style="font-size: 15px;letter-spacing: 1px;">v = np.linspace(-pi / 8, pi / 8, 94 * 1)</span></span>

<span><br /></span>

<span><br /></span>

<span><span style="font-size: 15px;letter-spacing: 1px;">x=a*np.outer(np.cos(u),np.cos(v))</span></span>

<span><span style="font-size: 15px;letter-spacing: 1px;">y=a*np.outer(np.sin(u),np.cos(v))</span></span>

<span><span style="font-size: 15px;letter-spacing: 1px;">z=b*np.outer(np.ones(np.size(u)),np.sin(v))</span></span>

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

<span><span style="font-size: 15px;letter-spacing: 1px;">bm=Image.open(r'result.png')</span></span>

<span><span style="font-size: 15px;letter-spacing: 1px;">bm=np.array(bm)</span></span>

<span><br /></span>

<span><br /></span>

<span><span style="font-size: 15px;letter-spacing: 1px;">colors=[]</span></span>

<span><br /></span>

<span><br /></span>

<span><span style="font-size: 15px;letter-spacing: 1px;">for i in range(bm.shape[1]-1,-1,-1):</span></span>

<span><span style="font-size: 15px;letter-spacing: 1px;"> item=[]</span></span>

<span><span style="font-size: 15px;letter-spacing: 1px;">for j in range(bm.shape[0]-1,-1,-1):</span></span>

<span><span style="font-size: 15px;letter-spacing: 1px;"> color=&quot;#{}{}{}&quot;.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))</span></span>

<span><span style="font-size: 15px;letter-spacing: 1px;"> item.append(color)</span></span>

<span><span style="font-size: 15px;letter-spacing: 1px;"> colors.append(item)</span></span>

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

最终的结果大概是这样:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

说不定会有意外惊喜的哟

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值