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

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

就像这样:

640?wx_fmt=png

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

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


640?wx_fmt=png

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

640?wx_fmt=png

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

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')

640?wx_fmt=png


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

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

#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值和椭球表面的点之间建立一一对应的关系。代码如下:

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就可以完成最后的绘制。

最终的结果大概是这样:

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

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

说不定会有意外惊喜的哟



猜你喜欢

1、五年总结:过往记忆大数据原创精选

2、华为发布会:  牛逼鸿蒙,吹水的大会

3、MongoDB 4.2 发布,支持分布式事务

4、Kafka 基础面试知识都在这,你都知道嘛?

5、慌的一批!妹子一个rm -rf把公司服务器数据删没了..

640?wx_fmt=png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值