Русский
Русский
English
Статистика
Реклама

Генерация дефолтных Github аватарок

В данной статье я покажу и расскажу, как можно сгенерировать аватарки как на Github.

Результат генерации для ника "test1"Результат генерации для ника "test1"

Для начала нужно понять, как устроена аватарка с Github'а. На первый взгляд, это просто случайный набор закрашенных квадратов (далее, блоков) в удачном порядке на сером фоне.

Сколько квадратов в аватаркеСколько квадратов в аватарке

В каждой аватарке 12 на 12 блоков.

Случайная автарка с просторов GithubСлучайная автарка с просторов Github

Взглянув на следующую картинку, думаю, вы поняли что изображения симметричны, поэтому будем генерировать матрицу блоков 6 на 12, а затем отразим и сконкатенируем две матрицы, получим матрицу 12 на 12.

Ну что ж, похоже, пора кодировать. Я буду делать это на python.

Подключим библиотеки

from PIL import ImageDraw, Imageimport numpy as npimport hashlib

Инициализируем переменные

background_color = '#f2f1f2's = 'test1'

Получаемнаборпсевдослучайныхбайт. Я буду использовать хеш-функцию для того, чтобы получать картинки от конкретной строки, так результат получится интереснее.

bytes=hashlib.md5(s.encode('utf-8')).digest()

Получаемцветизхеша

main_color=bytes[:3]main_color=tuple(channel//2+128forchannelinmain_color)#rgb

Генерируемматрицузаполненияблоков, для этого берем следующие байты. Так как матрица 6 на 12, а информации на каждый блок у нас один бит, то нам понадобится:

6 \cdot 12 \cdot 1\text{бит} = 72 \text{бит} = 9 \text{байт}
#матрица блоков6на12need_color=np.array([bit=='1'forbyteinbytes[3:3+9]forbitinbin(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

Вуаля. Давайте теперь посмотрим на сгенерированные аватарки для других никнеймов.

test2test2test3test3test4test4test5test5

И напоследок, специально для хабра.

habrhabrufoufo

На этом все. Спасибо тем, кто дочитал, а тех, кто хочет эксперементировать, отправляю в свой репозиторий со всем кодом.

Источник: habr.com
К списку статей
Опубликовано: 06.01.2021 22:04:18
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Работа с иконками

Python

Github

Аватар

Генерация изображений

Аватарки

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru