-
Notifications
You must be signed in to change notification settings - Fork 7
/
gen.py
66 lines (49 loc) · 2.01 KB
/
gen.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
from PIL import ImageDraw, Image
import numpy as np
import hashlib
def generate_avatar(avatar_size: int, nickname: str) -> None:
background_color = '#f2f1f2'
s = nickname
format = 'png'
path = f'{s}.{format}'
# Варианты генерации
## 12x12 - 144бит - 18байт
## 6*12 - 72бит - 9байт <- мне больше нравится
## Изображения получатся симметричными
## 6*6 - 36бит - 4.5байт
## Получаем набор псевдослучайных байт
bytes = hashlib.md5(s.encode('utf-8')).digest()
## Получаем цвет из хеша
main_color = bytes[:3]
# rgb
main_color = tuple(channel // 2 + 128 for channel in main_color)
## Генерируем матрицу заполнения блоков
# массив 6 на 12
need_color = np.array([bit == '1' for byte in bytes[3:3+9] for bit in bin(byte)[2:].zfill(8)]).reshape(6, 12)
# получаем матрицу 12 на 12
need_color = np.concatenate((need_color, need_color[::-1]), axis=0)
for i in range(12):
need_color[0, i] = 0
need_color[11, i] = 0
need_color[i, 0] = 0
need_color[i, 11] = 0
## Рисуем изображения по матрице заполнения
img_size = (avatar_size, avatar_size)
block_size = avatar_size // 12 # размер квадрата
img = Image.new('RGB', img_size, background_color)
draw = ImageDraw.Draw(img)
for x in range(avatar_size):
for y in range(avatar_size):
need_to_paint = need_color[x // block_size, y // block_size]
if need_to_paint:
draw.point((x, y), main_color)
img.save(path, format)
if __name__ == "__main__":
import sys
args = sys.argv
avatar_size = int(args[1])
nickname = args[2]
if avatar_size % 12 != 0:
print('avatar size must be a multiple of 12')
else:
generate_avatar(avatar_size, nickname)