Потому что ты не понимаешь, что делает from_bytes().
Creates a copy of an image memory from pixel data in a buffer.
In its simplest form, this function takes three arguments (mode, size, and unpacked pixel data).
Оно требует массив значений пикселей, а не содержимое в файле графического формата.
Используй
Image.open(). К слову, open() принимает на вход не только путь к файлу, но и файлоподобный объект. Это открывает две возможности:
1. Использовать класс io.BytesIO, чтобы хранить данные в памяти вместо временного файла.
2. Скормить PIL ответ сервера, используя .raw вместо .content.
Второй вариант предпочтительнее, так как не требует кэшировать в памяти всю картинку, но нужно проверить его работоспособность.