如何通过电报机器人发送PIL图像而不将其保存到文件中

时间:2018-12-24 23:49:17

标签: python python-3.x type-conversion python-imaging-library python-telegram-bot

对于电报机器人(python-telegram-bot),我生成了一个PIL.Image.Image,我想将其直接发送给用户。

有效的是从文件中将图像作为bufferedReader发送,但是我不想保护图像。此后我不再需要它,并且我可能同时生成许多不同的图像,因此保存有点混乱。

bot.send_photo(chat_id=update.message.chat_id,
               photo=open(img_dir, 'rb'),
               caption='test',
               parse_mode=ParseMode.MARKDOWN)

因为我自己生成了它,所以不能使用URL或file_id。我以为可以将图像转换为bufferedReader,但是我只能从中获取字节对象,这是行不通的。

图像的生成方式如下:

images = [Image.open(i) for i in dir_list]
widths, heights = zip(*(i.size for i in images))
total_width = sum(widths)
max_height = max(heights)
new_im = Image.new('RGBA', (total_width, max_height))

x_offset = 0
for im in images:
    new_im.paste(im, (x_offset, 0))
    x_offset += im.size[0]
return new_im                 # returns a PIL.Image.Image

预先感谢:)圣诞快乐

1 个答案:

答案 0 :(得分:1)

在github Wiki软件包中对此code snippet有所锁定

从内存中发布图像

在此示例中,图像是一个PIL(或枕头)图像对象,但是它对所有媒体类型都起作用。

from io import BytesIO
bio = BytesIO()
bio.name = 'image.jpeg'
image.save(bio, 'JPEG')
bio.seek(0)
bot.send_photo(chat_id, photo=bio)