Как с помощью telbot отправить фотографию с наложеным стикером?
Телеграм клиент дает возможность наложить стикер на изображение, можно ли такое сделать с помощью telebot?
Телеграм клиент дает возможность наложить стикер на изображение, можно ли такое сделать с помощью telebot?
Хороший вопрос, не знаю почему все заминусили. Краткий ответ — нет.
Библиотека 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)
А вот и результат:
Как мы видим бот получил от пользователя изображение, наложил ровно посередине заранее мною заготовленный стикер(стикеры можно сохранять в клиенте телеграмма как файлы) и отправил новое изображение мне обратно.
На этом конкретика с вашей стороны закончилась, я расписал пример решения, но вам предстоит отталкиваться от конкретных поставленных вами задач.