Каков наилучший способ сохранить изображение PIL в формате JSON? - PullRequest
2 голосов
/ 03 июня 2019

Я пытаюсь отправить json dict, который должен содержать изображение Pillow в качестве одного из его полей, для этого мне нужно преобразовать изображение в строку.Я попытался использовать функцию подушки: image.toString(), но все еще получил ее в байтах, поэтому я попытался закодировать ее:

buff = BytesIO()
image.save(buff, format="JPEG")
img_str = base64.b64encode(buff.getvalue())

, но все еще получил ее в байтах.Как я могу преобразовать изображения подушек в формат, который можно сохранить в файле json?

1 Ответ

2 голосов
/ 03 июня 2019

В комментариях Марк Сетчелл предлагает позвонить .decode('ascii') по результатам вашего b64encode звонка. Я согласен, что это будет работать, но я думаю, что для начала base64encoding представляет ненужный дополнительный шаг, который усложняет ваш код. *

Вместо этого я предлагаю напрямую декодировать байты, возвращаемые image.tostring. Единственное осложнение состоит в том, что объект bytes может содержать значения больше 128, поэтому вы не можете декодировать его с помощью ascii. Попробуйте использовать кодировку, которая может обрабатывать значения до 256, например latin1.

from PIL import Image
import json

#create sample file. You don't have to do this in your real code.
img = Image.new("RGB", (10,10), "red")

#decode.
s = img.tobytes().decode("latin1")

#serialize.
with open("outputfile.json", "w") as file:
    json.dump(s, file)

(* но, к моему удивлению, результирующий файл json по-прежнему меньше, чем файл, созданный с кодировкой latin1, по крайней мере для моего образца файла. Используйте свое собственное суждение, чтобы определить, важнее ли размер файла или ясность программы.)

...