Как с помощью telbot отправить фотографию с наложеным стикером?

Рейтинг: -3Ответов: 1Опубликовано: 03.07.2023

Телеграм клиент дает возможность наложить стикер на изображение, можно ли такое сделать с помощью telebot?

Ответы

▲ 0

Хороший вопрос, не знаю почему все заминусили. Краткий ответ — нет.

Библиотека telebot лишь предоставляет интерфейс для api телеграмма. То что происходит в клиенте когда вы накладываете стикер это работа с файлами картинок. Для этого в клиенте используются различные инструменты/библиотеки для работы с файлами.

Значит ли это, то что мы можем тоже использовать подобные инструменты для наложения картинки(стикер это тоже картинка) на другую картинку? - Да. Например, это позволяет библиотека - pillow.

Мы можем сохранить интересующие нас стикеры в качестве файла и используя координаты расположить их на фото полученное от пользователя, для примера я расположу стикер посередине.

P.s - да, я использовал в примере aiogram, но в данном случае программа слишком проста, и переписать на telebot не составит труда.


from aiogram import Bot
from aiogram import Dispatcher
from aiogram.utils import executor
from aiogram import types
import io
from PIL import Image

token = '3783273581:example-token'
bot = Bot(token=token)
dp = Dispatcher(bot)


@dp.message_handler(commands=['start'])
async def start(message: types.Message):
    await bot.send_message(message.from_user.id, 'Привет, отправь мне изображение и я наклею поверх него стикер')


@dp.message_handler(content_types=types.ContentTypes.PHOTO)
async def get_photo(message: types.Message):
    # Получаем фото
    photo = message.photo[-1]
    photo_file = await photo.get_file()
    photoObj = io.BytesIO()
    await bot.download_file(file_path=photo_file['file_path'], destination=photoObj)

    # Открываем изображения
    user_photo = Image.open(photoObj)
    sticker = Image.open('sticker.png')

    # Определение размеров первой и второй картинки
    width1, height1 = user_photo.size
    width2, height2 = sticker.size

    # Определение координат центра первой картинки
    center_x1 = width1 // 2
    center_y1 = height1 // 2

    # Определение координат верхнего левого угла второй картинки
    top_left_x = center_x1 - (width2 // 2)
    top_left_y = center_y1 - (height2 // 2)

    # Создание пустого изображения с прозрачным фоном
    combined_img = Image.new('RGBA', (width1, height1), (0, 0, 0, 0))

    # Накладывание первой картинки на пустую
    combined_img.paste(user_photo, (0, 0))

    # Накладывание второй картинки на первую
    combined_img.paste(sticker, (top_left_x, top_left_y), mask=sticker)

    # Записываем изображение в буфер
    buffer_new_photo = io.BytesIO()
    combined_img.save(buffer_new_photo, format='PNG')

    # Перемещаем указатель на начало буфера
    buffer_new_photo.seek(0)

    # Отправляем изменённое фото
    await bot.send_photo(message.from_user.id, buffer_new_photo)

    # Закрываем все буферы
    photoObj.close()
    user_photo.close()
    sticker.close()
    combined_img.close()
    buffer_new_photo.close()

if __name__ == "__main__":
    executor.start_polling(dp, skip_updates=True)

А вот и результат:

изображение результата работы программы

Как мы видим бот получил от пользователя изображение, наложил ровно посередине заранее мною заготовленный стикер(стикеры можно сохранять в клиенте телеграмма как файлы) и отправил новое изображение мне обратно.

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