Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用json保存PIL图像的最佳方法是什么_Python_Json_Python Imaging Library - Fatal编程技术网

Python 用json保存PIL图像的最佳方法是什么

Python 用json保存PIL图像的最佳方法是什么,python,json,python-imaging-library,Python,Json,Python Imaging Library,我试图发送json dict,它应该包含枕头图像作为他的字段之一,为此,我必须将图像转换为字符串。 我尝试使用枕头功能: image.toString() 但仍然以字节的形式获取,因此我尝试对其进行编码: buff = BytesIO() image.save(buff, format="JPEG") img_str = base64.b64encode(buff.getvalue()) 但仍然是字节。 如何将枕头图像转换为可以保存在json文件中的格式?在评论中,Mark Setchell建

我试图发送json dict,它应该包含枕头图像作为他的字段之一,为此,我必须将图像转换为字符串。 我尝试使用枕头功能:
image.toString()
但仍然以字节的形式获取,因此我尝试对其进行编码:

buff = BytesIO()
image.save(buff, format="JPEG")
img_str = base64.b64encode(buff.getvalue())
但仍然是字节。
如何将枕头图像转换为可以保存在json文件中的格式?

在评论中,Mark Setchell建议调用
.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文件仍然比使用拉丁1编码的文件小,至少对我的示例文件来说是这样。请根据您自己的判断确定文件大小或程序清晰度是否更重要。)

我使用以下内容通过json交换枕头图像

import json
from PIL import Image
import numpy as np

filename = "filename.jpeg"
image = Image.open(filename)
json_data = json.dumps(np.array(image).tolist())
new_image = Image.fromarray(np.array(json.loads(json_data), dtype='uint8'))

我不确定我是否理解这个问题。现在,您将数据作为字符串保存,并且希望将数据保存在json文件中,json文件能够保存字符串。那有什么问题?把你的字符串保存到文件中。也许这个
jstr=json.dumps({“image”:base64.b64encode(buff.getvalue()).decode('ascii')})
我不想和你争论或不同意你的观点,因为我在这里学到的东西和下一个人一样多。我认为JPEG编码可能是缩小尺寸的关键因素,而不是对base64效率的担忧。3000x4000px的彩色图像是36MB,但可能只有300kB的JPEG编码,而通过省略JPEG步骤,base64额外的30%的低效率(400kB)就相形见绌了。正如我所说,我是来学习的,可能是错的——我对Python和JSON非常陌生,很高兴看到解决方案的另一面并学习。@MarkSetchell观察得很好。我同意以JPEG格式保存可以大大提高内存。我的示例代码使用
tobytes()
而不是
image.save(buff,format=“JPEG”)
,因为它更简洁。但这对我的回答不是必要的;OP应该可以自由地继续使用他们的BytesIO策略,不管他们使用的是b64和ascii编码还是拉丁1编码。酷-感谢您花时间澄清。我已经投你一票了。嗨!你能解释一下为什么这是这个问题的好答案吗?