- 1. 写在前面
- 2. 素材准备
- 3. 依赖模块
- 4. 画超椭圆
- 5. 合成新图
- 6. 效果展示
- 7. 相关推荐
- 8. 引用参考
近日,小米公司发布新logo引发网友热议。 耗时2年,花费200万设计的新logo被吐槽,很多网友发表评论调侃。
乍一眼看确实是这样,不就是将方角矩形换成圆角矩形了嘛。
正所谓,外行人看热闹,内行人看门道。其实新logo边缘的形状并不是圆角矩形,而是超椭圆。
超椭圆有很多种类型,设计师原研哉最终采取的是
n=3
这一形状。 接下来我们便在python中,根据这一超椭圆公式来画图,并完成小米新logo的制作。
xiaomi_old_logo.png
,像素1200 x 1200
:https://img-blog.csdnimg.cn/2021040414023076.png
pip install matplotlib
pip install pillow
4. 画超椭圆
n=3
时的超椭圆公式:
∣
x
3
∣
+
∣
y
3
∣
=
1
|x^{3}|+|y^{3}|=1
∣x3∣+∣y3∣=1,其中
x
x
x的取值范围为[-1, 1]
。
因为我们要在matplotlib
中绘图,需要将公式转换为
y
y
y关于
x
x
x的函数方程:
f
(
x
)
=
{
+
1
−
∣
x
3
∣
3
−
1
≤
x
≤
1
−
1
−
∣
x
3
∣
3
−
1
≤
x
≤
1
f(x)=\left\{ \begin{array}{rcl} +\sqrt[3]{1-|x^{3}|}&{-1 \leq x \leq 1}\\ -\sqrt[3]{1-|x^{3}|}&{-1 \leq x \leq 1} \end{array} \right.
f(x)={+31−∣x3∣
−31−∣x3∣
−1≤x≤1−1≤x≤1
import matplotlib.pyplot as plt
import numpy as np
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('superellipse.png', transparent=True, dpi=100) # 1200 x 1200,设置透明,不留白
superellipse.png
,像素1200 x 1200
:https://img-blog.csdnimg.cn/20210404142251266.png
提取旧logo中白色mi
字部分并覆盖到对应像素位置的超椭圆图片上。(白色的rgb
值为255,255,255)
from PIL import Image
im_1 = Image.open('xiaomi_old_logo.png')
im_2 = Image.open('superellipse.png')
w, h = im_1.size
for i in range(w):
for j in range(h):
data = im_1.getpixel((i, j))
if data == (255,)*4:
im_2.putpixel((i, j), (255,)*4)
im_2.save('xiaomi_new_logo.png')
6. 效果展示
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.figure(figsize=(10, 5))
plt.subplot(121)
plt.title('新')
plt.axis('off')
plt.imshow(plt.imread('xiaomi_new_logo.png'))
plt.subplot(122)
plt.title('旧')
plt.axis('off')
plt.imshow(plt.imread('xiaomi_old_logo.png'))
plt.savefig('comparation.png', dpi=144)
plt.show()
7. 相关推荐
这里推荐一个在线函数曲线生成工具:https://www.desmos.com/calculator?lang=zh-CN
https://pillow-cn.readthedocs.io/zh_CN/latest/reference/Image.html#PIL.Image.Image.putpixel