Начальное_значение StringIO должно быть str, а не Bytes

Итак, у меня есть этот код:

from PIL import Image
import os, sys
import requests
from io import StringIO

url = "https://cdn.discordapp.com/avatars/247096918923149313/34a66572b9339acdaa1dedbcb63bc90a.png?size=256"
response = requests.get(url)
pp = Image.open(StringIO(response.content))
pp.save("image1.png")

pp = Image.open("image2c.png").convert("LA")
pp.save("image2c.png")

background = Image.open("image1.png").convert("RGBA")
foreground = Image.open("image2c.png").convert("RGBA")
foreground = foreground.resize((256, 256), Image.BILINEAR)
background.paste(foreground, (125, 325), foreground)
background.show()

Это возвращает ошибку: TypeError: initial_value must be str or None, not bytes

Я не вижу, где я ошибаюсь. Кто-нибудь может помочь?


person bob roberts    schedule 03.07.2017    source источник
comment
попробуйте вместо этого pp = Image.open(BytesIO(response.content)).   -  person Jean-François Fabre    schedule 03.07.2017


Ответы (1)


response — это двоичные данные (bytes), а Image также ожидает некоторые двоичные данные.

So:

pp = Image.open(StringIO(response.content))

вводит текстовый объект ввода-вывода в середине: не может преобразовать байты в текст (и следующей проблемой будет: невозможно прочитать текстовые данные в изображение)

Исправить:

from io import BytesIO
pp = Image.open(BytesIO(response.content))

РЕДАКТИРОВАТЬ: еще лучше, используйте Image.open(response.raw), как ответили здесь: Как загрузить изображение с помощью запросов

person Jean-François Fabre    schedule 03.07.2017