В комментариях Марк Сетчелл предлагает позвонить .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, по крайней мере для моего образца файла. Используйте свое собственное суждение, чтобы определить, важнее ли размер файла или ясность программы.)