В данной статье я покажу и расскажу, как можно сгенерировать аватарки как на Github.
Для начала нужно понять, как устроена аватарка с Github’а. На первый взгляд, это просто случайный набор закрашенных квадратов (далее, блоков) в удачном порядке на сером фоне.
В каждой аватарке 12 на 12 блоков.
Взглянув на следующую картинку, думаю, вы поняли что изображения симметричны, поэтому будем генерировать матрицу блоков 6 на 12, а затем отразим и сконкатенируем две матрицы, получим матрицу 12 на 12.
Ну что ж, похоже, пора кодировать. Я буду делать это на python.
Подключим библиотеки
from PIL import ImageDraw, Image
import numpy as np
import hashlib
Инициализируем переменные
background_color = '#f2f1f2'
s = 'test1'
Получаем набор псевдослучайных байт. Я буду использовать хеш-функцию для того, чтобы получать картинки от конкретной строки, так результат получится интереснее.
bytes = hashlib.md5(s.encode('utf-8')).digest()
Получаем цвет из хеша
main_color = bytes[:3]
main_color = tuple(channel // 2 + 128 for channel in main_color) # rgb
Генерируем матрицу заполнения блоков, для этого берем следующие байты. Так как матрица 6 на 12, а информации на каждый блок у нас один бит, то нам понадобится:
# матрица блоков 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)
Рисуем изображения по матрице заполнения
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.show()
И хоба
Хммм, что-то не то. Ах, да, забыл, самые крайние блоки всегда не цветные.
Исправим это, добавив рамку из пустых блоков.
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
Вуаля. Давайте теперь посмотрим на сгенерированные аватарки для других никнеймов.
И напоследок, специально для хабра.
На этом все. Спасибо тем, кто дочитал, а тех, кто хочет эксперементировать, отправляю в свой репозиторий со всем кодом.
VK объявляет о приобретении 40% компании Intickets.ru (Интикетс). Это облачный сервис для контроля и управления продажей билетов на мероприятия. Сумма…
OpenAI готовится запустить собственную поисковую систему на базе ChatGPT. Информацию об этом публикуют западные издания. Ожидается, что новый поисковик может…
Центр управления связью общего пользования (ЦМУ ССОП) Роскомнадзора рекомендовал компаниям из реестра провайдеров ограничить доступ поисковых ботов к информации на российских сайтах.…
Apple возобновила переговоры с OpenAI о возможности внедрения ИИ-технологий в iOS 18, на основе данной операционной системы будут работать новые…
Конкурсный управляющий российской «дочки» Google подготовил 23 иска к участникам рекламного рынка. Общая сумма исков составляет 16 млрд рублей –…
Google завершил обновление основного алгоритма March 2024 Core Update. Раскатка обновлений была завершена 19 апреля, но сообщил об этом поисковик…