Python 用json保存PIL图像的最佳方法是什么
我试图发送json dict,它应该包含枕头图像作为他的字段之一,为此,我必须将图像转换为字符串。 我尝试使用枕头功能: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建
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编码。酷-感谢您花时间澄清。我已经投你一票了。嗨!你能解释一下为什么这是这个问题的好答案吗?