Как взять уменьшенную картинку (url) из канала discord?
Когда в текстовый канал присылают картинку, её можно открыть в миниатюре, а можно нажать открыть оригинал. Если копировать ссылку уменьшенного варианта, то там в конце ссылки будет указан размер изображения, а если взять оригинал, то там без этой приставки.
Пример: Оригинал: https://cdn.discordapp.com/attachments/1021497810589339719/1024930675981287475/tLP5wpEUe6I.png
Как вытащить просто url адрес из изображения я знаю:
ctx.message.attachments[0].url
, но берётся оригинал, а мне нужно именно уменьшенный вариант.
Суть вопроса: Как взять именно уменьшенный вариант картинки? Просто дописать к адресу нужный размер не вариант, потому что все картинки могут быть разного соотношения сторон и если указать для всех один размер, то будет коряво.
Подойдёт как вариант взять сразу уменьшенную версию, так и узнать размер оригинала, затем просто взять к примеру 30% от каждого числа сторон и добавить в итоговый url. Если есть несложный модуль для уменьшения изображения также по url, сгодится.
Для примера код команды, которая вытягивает просто url:
@bot.command()
@commands.has_any_role(tagger)
async def addart(ctx, *args):
arguments = ' '.join(args)
wrote_args = [arguments][0].split(', ')
art_url = ctx.message.attachments[0].url
in_tag = wrote_args
cur.execute(f"""INSERT INTO images (URL, artist) VALUES ('{art_url}', '{in_tag[0].lower()}')""")
cur.execute(f"""SELECT nA, artist FROM images ORDER BY nA DESC LIMIT 1""")
out_tag = cur.fetchall()
cur.execute(f"""INSERT INTO A_T (artID, tagID) VALUES ('{out_tag[0][0]}', '{out_tag[0][1]}')""")
await ctx.send("Image added successfully!")
adb.commit()
Ответы (1 шт):
Понял, что вряд ли кто-то заморачиваться будет над помощью в таком, поэтому сделал очередной костыль:
@bot.command()
@commands.has_any_role(tagger)
async def addart2(ctx, *args):
arguments = ' '.join(args)
wrote_args = [arguments][0].split(', ')
art_url = ctx.message.attachments[0].url
id_m = ctx.message.attachments[0].id
id_ch = ctx.channel.id
height = ctx.message.attachments[0].height
width = ctx.message.attachments[0].width
filename = ctx.message.attachments[0].filename
mini_h = height
mini_w = width
if height >= 6000 and width >= 3500:
mini_h = (height * 30)//100
mini_w = (width * 30)//100
elif height >= 4000 and width >= 6000:
mini_h = (height * 30)//100
mini_w = (width * 30)//100
elif height >= 3500 and width >= 2000:
mini_h = (height * 70)//100
mini_w = (width * 70)//100
mini = f'https://media.discordapp.net/attachments/{id_ch}/{id_m}/{filename}?width={mini_w}&height={mini_h}'
in_tag = wrote_args
cur.execute(f"""INSERT INTO size (hight, width, filename, url, mini, artist) VALUES ('{height}', '{width}', '{filename}', '{art_url}', '{mini}', '{in_tag[0].lower()}')""")
await ctx.send("Image added successfully!")
adb.commit()
Здесь после отправки сообщения с вложенным изображением, бот вытягивает высоту, ширину, имя файла, id канала и сообщения, раскидывая по переменным.
Все эти данные создают итоговую ссылку, в которую нужно будет вставить уже изменённые высоту и ширину.
Сделал условия, что если изображение большое, то есть параметры больше какого-либо порогового значения, которое можно назвать большим, то код берёт от этих значений 30% от числа, тем самым создаём изображение на 70% меньше разрешением. Таких проверок несколько, потому что бывают вертикальные или горизонтальные большие картинки. Для тех, что поменьше, берёт 70% от размера, чтобы слишком сильно не сжимать.
Для нормальных оставляем те же значения.
Всё отправляет в бд, но это уже не по этому вопросу.