Цитата:
Сообщение от xSkateboard
Здарова, юзеры бластхака!
Вчера увидел сообщение в группе ВК, про новый список администрации на форуме сервере 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/.../сюда и запускаем код (лучше скопируйте с гита его)
|
Давай в стиле Brawl Stars,так уж каждому понравится
|