前段时间,小米公司发布了一条微博,引发了热议,原来小米换了新logo了。很多人,都觉得雷总被骗了。说实话,我当时猛的一看,也是很蒙蔽,可能咋们不懂美学,不懂新logo背后蕴藏的文化底蕴吧!) L! y  @: U5 [( v  O! @        但是,原设计者原研哉说到:最新设计的小米logo,融入了东方哲学的思考,从而提出了一个具有「超椭圆」数学之美的小米新 LOGO,同时还增加了黑色和科技银来作为小米品牌色彩的新搭档。4 r- H3 m# o# Z- w9 a- Q) R" S# d) K        原研哉还说到:在验证的过程中,用到了一个数学公式。' N0 E$ _$ y7 [7 w, K 
 
) ]: w8 o0 P  B  X7 \; N5 t 7 s0 p& D0 ^" {- X) b* q6 m" }8 x# j( u 
 
' t3 J, A5 ^1 ~) L0 W1 R 
 
7 L- }) y  F' k- P+ i/ b8 e9 a6 } ① 绘图原理 ) _7 q# Y( a9 j) m2 ^3 u        在正式绘图之前,我们先来讲述一下Python绘制新logo的“绘图原理”。掌握了原理后,剩下的问题就交给代码吧。" \+ i' p* @. t# ]* ^; X" x ①利用 “超椭圆” 公式,绘制一个带填充色的椭圆; ② 遍历 “旧logo” 上的像素值,保留白色 “米字” 处的像素值; ③ 将带“米字” 的像素值,写入第一步的超椭圆中;, t- u* o7 `. q  ② 重要知识点的普及 ' e" ]- t) u* M) C. I& u2 M ! F0 F# v3 D! n/ k0 P5 B ① plt.fill():用于给图形填充颜色; ② plt.axis():用于打开/取消坐标轴展示; ③ plt.subplots_adjust()和plt.margins():用于去掉图形外侧多余的留白; ④ image.getpixel():用于读取图片的像素值; ⑤ image.putpixel():用于在指定坐标位置处,写入像素值;. l" P/ o, W2 a& b  ③ 上代码 ) B* b8 {0 p0 R9 p6 j        首先我们先导入相关库:% N! H4 C0 \: G# e( m+ ? import matplotlib.pyplot as plt
import numpy as np
from PIL import Image# v& [! o& ^8 W& u- ~- o4 V 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) # 设置保存图片的透明值4 k6 \3 O5 |8 v 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')/ x6 h7 e1 C9 r/ f* I 
 
' v3 R; I4 ?8 n  p. N$ P