Aiogram. Конвертация jpg в png

Рейтинг: 0Ответов: 1Опубликовано: 30.04.2023

День добрый. Создаю бота, цель которого пока что принять от пользователя фото в формате .jpg и конвертировать в .png, ну и отправить пользователю.

Мой код (не работает):

import logging
import io
import os

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

# установка уровня логирования
logging.basicConfig(level=logging.INFO)

dp = Dispatcher(bot)

@dp.message_handler(commands=['start'])
async def start_command(message: types.Message):
    await message.reply("Привет. Скинь фотографию в формате .jpg")


@dp.message_handler(content_types=types.ContentType.PHOTO)
async def convert_photo(message: types.Message):
    photo = message.photo[-1]
    file = await photo.get_file()
    photo_info = {'file_id': file.file_id, 'file_size': file.file_size, 'file_path': file.file_path, 'width': photo.width, 'height': photo.height}
    photo_bytes = await file.download()
   
    with Image.open(io.BytesIO(photo_bytes)) as im:
        with io.BytesIO() as output:
            im.save(output, format="png")
            output.seek(0)
            await message.answer_photo(output.getvalue())
    

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

Подскажите в чем проблема, заранее благодарен.

Ответы

▲ 1Принят

Вот хэндлер, который будет ловить присланную картинку и отправлять обратно png-файлом. Важно, чтобы бот отвечал именно документом, так как при отправке телеграм конвертирует все картинки в jpg

@dp.message_handler(content_types='photo')
async def convert_photo(message: types.Message):
    image = io.BytesIO()
    photo = message.photo[-1]
    file = await photo.download(destination_file=image)
    with Image.open(file) as im:
        im.save(image, format="png")
        image.seek(0)
        await message.answer_document(('your_file.png', image))