Не округляется фото с помощью библиотеки pillow

Рейтинг: 0Ответов: 1Опубликовано: 20.03.2023

Я хочу сделать, что то наподобие карточки пользователя при помощи дискорд бота. Основная суть, это я хочу что бы на карточке был круглый аватар пользователя. Вот код команды

@bot.command()
async def png(ctx):
    imag=Image.open("large.png")# Это фоновое изображение
    img=imag.resize((1162, 648))# Размеры фона
    url=str(ctx.author.avatar)# Находим аватар автора
    response=requests.get(url, stream=True)
    response=Image.open(io.BytesIO(response.content))
    response=response.convert("RGBA")# Переводим автар в RGBA 
    response=response.resize((400, 400), Image.ANTIALIAS)# Устанавляваем для автара размеры
    size=(400, 400)# Размеры маски
    mask=Image.new("L", size, 0)# Создание маски
    draw=ImageDraw.Draw(mask)# Рисуем маску
    draw.ellipse((0, 0) + size, fill=255)# Размеры и цвет маски для альфа канала
    output=ImageOps.fit(response, mask.size, centering=(0.5, 0.5))# Центрируем маску на аватар
    output.putalpha(mask)# Накладываем альфа канал на маску
    output.save("output.png")# Сохраняем обрезанный аватар по маске
    output2=Image.open("output.png")# Открываем снова аватар (уже обрезанный)
    output2=output2.convert("RGBA")# Переводим в RGBA 
    img.paste(output2, (700, 50))# Устанавливаем расположение аватара на фоне
    idraw=ImageDraw.Draw(img)# Соединяем фон и аватар
    
    name=ctx.author.name# Не важно
    tag=ctx.author.discriminator# Не важно
    headline=ImageFont.truetype("a_AssuanTitulStrDs.ttf", size=60)# Не важно
    undertext=ImageFont.truetype("a_AssuanTitulStrDs.ttf", size=35)# Не важно
    idraw.text((470, 500), f"{name}", font=headline)# Не важно
    idraw.text((470, 548), f"Welcome", font=undertext)# Не важно
    img.save("user_card.png")# Сохраняем полноценную картинку со всеми изминениями
    await ctx.send(file=disnake.File(fp="user_card.png"))# Выкладываем фото в чат

Команда работает, но не обрезает аватар по кругу. Вот сама фотокарточка, что команда выдает в конечном итоге. Получается такая карточка

При чем, при сохранении аватара на компьютер, он его обрезает так как надо и при открытии фотографии, она отображается корректно, но в промежутке между открытием аватара по коду и связывания его с фоном, аватар каким то образом опять становится квадратным, как на фото сверху. Все корректно отоброжается

Ответы

▲ 1

При вставке изображения с альфа каналом, нужно добавить маску в виде самого изображения.

img.paste(output2, (700, 50), output2)# Устанавливаем расположение аватара на фоне