前段时间,小米公司发布了一条微博,引发了热议,原来小米换了新logo了。很多人,都觉得雷总被骗了。说实话,我当时猛的一看,也是很蒙蔽,可能咋们不懂美学,不懂新logo背后蕴藏的文化底蕴吧!8 \+ `6 t; D" i0 j1 ^
但是,原设计者原研哉说到:最新设计的小米logo,融入了东方哲学的思考,从而提出了一个具有「超椭圆」数学之美的小米新 LOGO,同时还增加了黑色和科技银来作为小米品牌色彩的新搭档。
' C4 T z9 u! E6 f% M, P 原研哉还说到:在验证的过程中,用到了一个数学公式。: k7 V9 L% M( |; p
0 w* ]7 w9 L8 q# Q2 {7 T# C
从上面的公式可以看到,这里有一个n,因此可以知道:上述公式能够绘制出n种类型的超椭圆。而设计者最终推荐使用n=3这一形状。
5 @0 a8 V8 U. m. E8 S2 c6 K
* d7 R7 e0 P; P! v$ k- l* ?' g
' y9 Q# N2 c: ?/ a9 P6 n! @1 v
① 绘图原理' e- g( [ R, p$ t; n" A3 t# r
在正式绘图之前,我们先来讲述一下Python绘制新logo的“绘图原理”。掌握了原理后,剩下的问题就交给代码吧。
9 X% F* v$ p$ M/ _- ①利用 “超椭圆” 公式,绘制一个带填充色的椭圆;
- ② 遍历 “旧logo” 上的像素值,保留白色 “米字” 处的像素值;
- ③ 将带“米字” 的像素值,写入第一步的超椭圆中;+ M( \& z' u! p
② 重要知识点的普及
; w' J' A& M! L8 _ 关于整个代码,有几个函数需要给大家提一下,为了大家更够很快学习。但是不会讲解的很详细,大家可以根据说明,自行下去查阅相关资料。$ O0 v a, H# T1 O
- ① plt.fill():用于给图形填充颜色;
- ② plt.axis():用于打开/取消坐标轴展示;
- ③ plt.subplots_adjust()和plt.margins():用于去掉图形外侧多余的留白;
- ④ image.getpixel():用于读取图片的像素值;
- ⑤ image.putpixel():用于在指定坐标位置处,写入像素值;
! T1 s3 ^$ ^5 K3 k( J9 k# v. B" Q ③ 上代码2 Y* p$ ~, S) G$ w' e" L) b
首先我们先导入相关库:
4 d4 L) ]0 G. ^5 @4 o0 V2 ]
- import matplotlib.pyplot as plt
- import numpy as np
- from PIL import Image
接着,利用上面 提到的公式,绘制一个不留白的n=3的超椭圆。; {# v4 O2 [* ?* G. g1 X
- x = np.linspace(-1, 1, 1000)
- y = + pow(1-abs(pow(x, 3)), 1/3) # 注意公式的写法
- z = - pow(1-abs(pow(x, 3)), 1/3) # 注意公式的写法
- plt.figure(figsize=(12, 12)) # 画布大小
-
- plt.plot(x, y, color=(255/255, 103/255, 0))
- plt.plot(x, z, color=(255/255, 103/255, 0))
- plt.fill(x, y, color=(255/255, 103/255, 0)) # 填充颜色
- plt.fill(x, z, color=(255/255, 103/255, 0)) # 填充颜色
- plt.axis('off') # 不显示坐标轴
- plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0)
- plt.margins(0, 0)
- plt.savefig('fill.png', transparent=True, dpi=100) # 设置保存图片的透明值
然后,遍历旧logo的像素值,保留 “米字” 那一块儿。将该像素值,写入上面的 “fill.png” 中。有一点需要注意的是:白色的rgb值是255, 255, 255。
) j( i; {. m5 Y- d7 W/ H X/ K- image_1 = Image.open('old.png')
- image_2 = Image.open('fill.png')
-
- w, h = image_1.size
-
- for i in range(w):
- for j in range(h):
- data = image_1.getpixel((i, j))
- if data == (255,)*4:
- image_2.putpixel((i, j), (255,)*4)
-
- image_2.save('new.png')
④ 最终呈现效果0 U/ L0 Q7 W9 Z0 N& k. l, H
2 C5 v0 z9 c3 R6 q/ ` |