как обработать фото с помощью телеграмм бота не сохраняя его локально (python telegrambotapi)
не могу сообразить как можно обработать изображение(pillow) полученное из телеграмм с помощью бота(pytelegrambotapi), не сохраняя его локально.
@bot.message_handler(content_types=['photo'])
def handle_docs_document(message):
file_info = bot.get_file(message.photo[len(message.photo) - 1].file_id)
downloaded_file = bot.download_file(file_info.file_path)
src = 'C:/Users/мси/Desktop/bot_photo/' + message.photo[1].file_id
with open(src, 'wb') as new_file:
new_file.write(downloaded_file)
bot.reply_to(message, "Фото добавлено")
img = Image.open(src)
img.save('test.jpg')
bot.send_photo(message.chat.id, photo=open('test.jpg', 'rb'))
bot.polling()
Ответы (1 шт):
PIL.Image.open() принимает имя файла или файловый объект, Для загрузки сжатого изображения из памяти документация советует передавать объект BytesIO. Если bot.download_file возвращает bytearray, Попробуйте что-нибудь вроде
fp=io.BytesIO(downloaded_file)
img = Image.open(fp)
PS Похоже pyTelegramBotAPI download_file оборачивает requests.get().content, который как раз возвращает байты: https://requests.readthedocs.io/en/latest/user/quickstart/#binary-response-content
PPS попробовал сделать
requests.get('http://site/bla.gif')
b=io.BytesIO(r.content)
p=PIL.Image.open(b)
p.save('test.jpg')
и оно свалилось потому что не может автоматически конвретировать gif в jpeg. В зависимости от того, что вы будете делать с картинкой в pillow, обратите внимание что есть разные форматы и режимы.
PPPS второе сохранение опять можно сохранить в BytesIO, ну или сдаться и все же использовать временные файлы: https://docs.python.org/3/library/tempfile.html