- 39
- 130
Здарова, юзеры бластхака!
Вчера увидел сообщение в группе ВК, про новый список администрации на форуме сервере Casa-Grande
Вышло прикольно (но я ненавижу бравл старс емае), но вот как своевременно обновлять это всё? Поэтому у меня зародилась идея - автоматизировать создание подобной пикчи. Что я и реализовал за 2 часа. (Результат под спойлером в конце поста)
Гитхаб: https://github.com/qskateboard/graphicAdminsList
Для начала определимся, в стиле чего будет делать? Я взял Genshin Impact, ибо знаю эту игру да и лого персонажей легко найти в интернете. Находим шрифт от этой игры, чтобы всё было в одном стиле.
Работать мы будем естественно на питоне и графической библиотеки Pillow
Далее идет код и рядом с ним объяснение, что делает.
И основная функция:
Заливаем пикчи в директорию img/.../сюда и запускаем код (лучше скопируйте с гита его)
Вчера увидел сообщение в группе ВК, про новый список администрации на форуме сервере Casa-Grande
Вышло прикольно (но я ненавижу бравл старс емае), но вот как своевременно обновлять это всё? Поэтому у меня зародилась идея - автоматизировать создание подобной пикчи. Что я и реализовал за 2 часа. (Результат под спойлером в конце поста)
Гитхаб: https://github.com/qskateboard/graphicAdminsList
Для начала определимся, в стиле чего будет делать? Я взял Genshin Impact, ибо знаю эту игру да и лого персонажей легко найти в интернете. Находим шрифт от этой игры, чтобы всё было в одном стиле.
Работать мы будем естественно на питоне и графической библиотеки Pillow
Далее идет код и рядом с ним объяснение, что делает.
Генерация карточки администратора:
def generate_single_admin(admin, level):
global font, font_grade
files = glob("img/" + level + "/*") # Получаем массив со всеми файлами определенного уровня адм
img = Image.open(files[admin["index"]]) # Получаем картинку по пути, который равняется номеру админа
draw = ImageDraw.Draw(img)
w, h = draw.textsize(admin['nickname'], font=font) # Тут мы получаем ширину и высоту ника
w2, h2 = draw.textsize(admin['grade'], font=font_grade) # Аналогично верхнему, только должность
offset_y = (256 - h2) / 1.25
if w > w2: # Тут должна была быть динамичнеское определение плашки с информацией, но сделал так
rect = (0, offset_y - 5, 255, offset_y + 55) # Точка начала и конца прямоугольника
else:
rect = (0, offset_y - 5, 255, offset_y + 55)
draw.rounded_rectangle(rect, fill=(255, 255, 255), outline=(24, 24, 24), radius=4) # Рисуем прямоугольник
draw.text(((256 - w) / 2, offset_y), admin['nickname'], (44, 44, 44), font=font) # Пишем ник
draw.text(((256 - w2) / 2, offset_y + 30), admin['grade'], (44, 44, 44), font=font_grade) # Пишем должность
return img # Возвраащем объект готовой карточки
И основная функция:
Основная функция:
def generate_picture(admin_list, count):
titles = { # Название уровней
"sr_admin": "ГЛАВНАЯ АДМИНИСТРАЦИЯ",
"admin": "АДМИНИСТРАЦИЯ ЧЕТВЁРТОГО УРОВНЯ",
"jnr_admin": "АДМИНИСТРАЦИЯ ТРЕТЬЕГО УРОВНЯ",
"moderator": "АДМИНИСТРАЦИЯ ВТОРОГО УРОВНЯ",
"helper": "АДМИНИСТРАЦИЯ ПЕРВОГО УРОВНЯ"
}
# Создаем фон с динамическим размером
background = Image.new(mode="RGB", size=(256 * 3 + 150, int(count / 3) * (256 + 120)))
draw = ImageDraw.Draw(background)
y = 0 # Задаем высоту
prev_grade = ""
for key, value in admin_list.items(): # Проходимся по всем уровням админки отдельно
if prev_grade != key: # Если уровень админки поменялся от прошлого в цикле
prev_grade = key
y += 100 # Поднимаем оффсет высоты
w, h = draw.textsize(titles[key], font=font_title) # Узнаем высоту и ширину название уровня
draw.text(((256 * 3 + 150 - w) / 2, y - 70), titles[key], (255, 255, 255), font=font_title) # Пишем текст по центру экрана
# Задаем переменные для полоски из 3 карточек
row = 0
x = 25
# Делаем так, чтобы если все администраторы не делятся на 3 нацело
remain = len(value) % 3
if remain == 1: # То сначала рисуется по центру 1 админ по коордам
x = int(75 + (256 * 3) / 3)
if remain == 2: # Тут по другим коордам 2 админа
x = int(30 + (256 * 3) / 5)
for admin in value: # Проходимся циклом по всем админам в опр. уровне
if row == 3 or (row == remain and row != 0): # Если 3 админа уже нарисовно или условие remain
# Обнуляем переменные и делаем перенос строк
row = 0
x = 25
y += 256 + 50
remain = 0
single = generate_single_admin(admin, key) # Генерируем карточку администратора
background.paste(single, (x, y), mask=single) # Вставляем на фон, mask=single нужно, чтобы прозрачные поля корректно отображались
# Делаем отступ вправо
x += 256 + 50
row += 1
y += 256 + 50 # Перенос строки (уровень админки новый)
# Тут создаем текст и пишем в конце холста, естественно центрируя по центру
text_count = "Общее количество администраторов - {}.".format(count)
y += 200
w, h = draw.textsize(text_count, font=font_title)
draw.text(((256 * 3 + 150 - w) / 2, y - 70), text_count, (255, 255, 255), font=font_title)
background.save("result.png") # Сохраняем результат
Заливаем пикчи в директорию img/.../сюда и запускаем код (лучше скопируйте с гита его)