Я пытаюсь отправить объект PIL Image в раздаточный чат (хотя я не хочу сохранять файл). У меня есть функция, которая собирает изображения из целого rnet, соединяет их по вертикали и затем возвращает объект PIL Image.
Приведенный ниже код создает изображение файла из объекта PIL Image на моем локальном компьютере, а затем отправляет его в чат Discord. Я не хочу постоянно воссоздавать и сохранять изображение файла на моей машине. Как я могу просто отправить объект PIL Image вместо необходимости сохранять изображение каждый раз, когда я отправляю запрос?
from PIL import Image
from io import BytesIO
import requests
import discord
# Initializes Discord Client
client = discord.Client()
# List of market indexes
indexes = [
'https://finviz.com/image.ashx?dow',
'https://finviz.com/image.ashx?nasdaq',
'https://finviz.com/image.ashx?sp500'
]
# Returns a vertical image of market indexes
def create_image():
im = []
for index in indexes:
response = requests.get(index)
im.append(Image.open(BytesIO(response.content)))
dst = Image.new('RGB', (im[0].width, im[0].height + im[1].height + im[2].height))
dst.paste(im[0], (0, 0))
dst.paste(im[1], (0, im[0].height))
dst.paste(im[2], (0, im[0].height + im[1].height))
return dst
# Prints when bot is online
@client.event
async def on_ready():
print('{0.user} is online'.format(client))
# Uploads vertical image of market indexes when requested
@client.event
async def on_message(message):
if message.content.startswith('^index'):
create_image().save('index.png')
await message.channel.send(file=discord.File('index.png'))
РЕШЕНИЕ:
@client.event
async def on_message(message):
if message.content.startswith('^index'):
with BytesIO() as image_binary:
create_image().save(image_binary, 'PNG')
image_binary.seek(0)
await message.channel.send(file=discord.File(fp=image_binary, filename='image.png'))